如何检测文件是否可以在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的findfind_all将会很有用。

    链接地址: http://www.djcxy.com/p/60405.html

    上一篇: How can I detect whether a file is writeable in Ruby?

    下一篇: How to check whether a string contains a substring in Ruby?