我需要检查文件对象的打开方法。例如。是r,r +,w,等等。
thefile = File.open(filename, method)
必须使用文件对象而不仅仅是文件名。
答案 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+"
的情况下丢失文件。
沿着同一条线来区分其他模式。