【问题标题】:How can I detect whether a directory is writeable in Ruby如何检测目录是否可在 Ruby 中写入
【发布时间】:2012-02-19 10:55:51
【问题描述】:

我正在使用 Ruby,需要在尝试创建新文件之前检测目录是否可写。

我尝试了以下代码,它根据@path 是否为目录正确返回真/假。 但是,当@path 文件夹没有写入权限时,它仍然返回true。

  if File.directory?(@path) && File.writable?(@path)
    #is a writeable directory
    true
  else
    #is not a writeable directory
    false
  end

我查看了 File 和 Dir 类的帮助,但看不到任何允许我检查目录写入权限的方法。有什么办法吗?

我只需要它在 Windows 上工作,使用 Ruby 1.9.3。

【问题讨论】:

    标签: ruby file permissions directory writable


    【解决方案1】:

    对于 Windows,您需要来自 win32-file gem 的 File.attributesFile.readonly? 方法。

    而且你应该考虑为 Daniel Berger 做出贡献,因为没有他的 win32-gems,Windows 上的 Ruby 将是一个更加充满敌意的地方。

    【讨论】:

    • 似乎 File.attributes 只会为写权限被拒绝的目录返回["directory", "indexed"]。同样,File.readonly?返回假。在文件上使用时,#attributes 和 #readonly?方法按预期工作。
    • @SimonMayer 很奇怪。我从来没有使用过这个,我现在不在 Windows 上进行测试,但我的经验是 win32-gem 非常可靠。由于这也被明确记录为适用于目录,我想知道:您确定您的目录的权限是您认为的吗?
    • 我目前只能测试一个相当奇怪的情况,但由于它可以合法发生,我还是想检测它。我创建了一个新的本地文件夹,并明确拒绝了我的用户(当然还有管理员用户)的“写入”权限。所以,不同寻常的是,我是目录的所有者,但不能写入它。这肯定会阻止 Ruby 使用File.open("...", "w+") 创建和写入文件,因为只要我删除写入拒绝,就可以创建/编辑文件。也许#attributes 只返回文件而不是目录的“只读”。
    【解决方案2】:

    你也许可以通过使用world_writable?(filename)来做到这一点

    http://ruby-doc.org/core-1.9.3/File.html#method-c-world_writable-3F

    【讨论】:

    • 这不起作用。它在所有情况下都返回零。我通过将新文件写入目录并再次读取其内容来测试它。 code directory = "C:" + File::SEPARATOR + "1234" puts File.directory?(directory).inspect puts File.world_writable?(directory).inspect File.open(directory + File::SEPARATOR + "newfile.txt", "w+"){|f| f.write "FileContents"} File.open(directory + File::SEPARATOR + "newfile.txt", "r"){|f| puts f.read }
    猜你喜欢
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 2011-04-05
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    相关资源
    最近更新 更多