Ruby找出打开的模式文件

时间:2015-02-04 22:25:15

标签: ruby

我需要检查文件对象的打开方法。例如。是r,r +,w,等等。

thefile = File.open(filename, method)

必须使用文件对象而不仅仅是文件名。

2 个答案:

答案 0 :(得分:5)

在POSIX平台上,您可以使用F_GETFL调用IO#fcntl来获取文件状态标志:

require 'fcntl'

def filemode(io)
  flags = io.fcntl(Fcntl::F_GETFL)
  case flags & Fcntl::O_ACCMODE
  when Fcntl::O_RDONLY
    'r'
  when Fcntl::O_WRONLY
    (flags & Fcntl::O_APPEND).zero? ? 'w' : 'a'
  when Fcntl::O_RDWR
    (flags & Fcntl::O_APPEND).zero? ? 'r+ / w+' : 'a+'
  end
end

File.open('test.txt', 'r') { |f| puts filemode(f) }   #=> r
File.open('test.txt', 'w') { |f| puts filemode(f) }   #=> w
File.open('test.txt', 'a+') { |f| puts filemode(f) }  #=> a+

fcntl的返回值是各个O_*标志的按位OR:

Fcntl::O_RDONLY   # 0
Fcntl::O_WRONLY   # 1
Fcntl::O_RDWR     # 2
Fcntl::O_APPEND   # 4
Fcntl::O_NONBLOCK # 8

Fcntl::O_ACCMODE可用于屏蔽文件访问模式。

更多信息:

答案 1 :(得分:0)

我不会为你编写完整的脚本,但会给你一个提示。

假设您已打开IO:

io = File.open("/tmp/foo", "r")

假设io已成功创建,您可以尝试write来判断是否已将其打开以进行编写:

begin
  io.write("")
rescue IOError => e
  puts e.message
end
#=> not opened for writing

请确保在尝试此操作之前复制该文件,以免在模式为"w""w+"的情况下丢失文件。

沿着同一条线来区分其他模式。