如何检测文件是否可以在Ruby中写入?
如果其中任何一个为真,函数应该返回false:
如果所有这些都是真的,函数应该返回true:
该功能必须在使用Ruby 1.9.3的MAC OSX上工作。
以下方法在文件尚不存在时返回false,并且应该是可写的,即使我从我自己的用户目录的子目录运行它:
File.writable?('./my-file-name')
我会接受一个解决方案,包括调用文件打开并在写入失败时捕获异常,尽管我更喜欢不依赖于异常。
这是我到目前为止,但它不处理一些边缘情况:
def file_writable?(filename)
return false if (filename || '').size == 0
return false if File.directory?(filename)
return false if File.exists?(filename) && !File.writable(filename)
return true;
end
我仍然不知道如何方便地测试任何目录段是否丢失,或者名称中是否有怪异字符以及其他一些情况。
Ruby在其std-lib中包含了Pathname,它是一些其他面向文件的类的包装:
包括File,FileTest以及一些Dir和FileUtils的所有功能都包含在内,这并不令人惊讶。 它基本上是所有这些的外观,等等。
“路径名”可以是目录或文件。
路径名不会完成所有你需要的事情,但它是一个非常方便的起点。 您可以轻松地添加所需的附加功能,因为它是一个包装器,比使用各个类实现解决方案要容易得多。
当我不得不做很多目录/文件处理时,这是我的上课。
require 'pathname' # => true
foo = Pathname.new('/usr/bin/ruby') # => #<Pathname:/usr/bin/ruby>
foo.writable? # => false
foo.directory? # => false
foo.exist? # => true
tmp = Pathname.new('/tmp/foo') # => #<Pathname:/tmp/foo>
tmp.write('bar') # => 3
tmp.writable? # => true
tmp.directory? # => false
tmp.exist? # => true
bin = Pathname.new('/usr/bin') # => #<Pathname:/usr/bin>
bin.writable? # => false
bin.directory? # => true
bin.exist? # => true
fake = Pathname.new('/foo/bar') # => #<Pathname:/foo/bar>
fake.exist? # => false
您无法知道目录中缺少哪些组件,但通常我们会尝试创建它并在出现异常时进行挽救,从而处理权限错误。 编写代码来查找完整的目录路径并不难,然后在完整路径不存在的情况下迭代目录链,将每个目录作为前一个子目录的子目录。 Enumerable的find
和find_all
将会很有用。
上一篇: How can I detect whether a file is writeable in Ruby?
下一篇: How to check whether a string contains a substring in Ruby?