【问题标题】:Ruby (Errno::EACCES) on File.deleteFile.delete 上的 Ruby (Errno::EACCES)
【发布时间】:2011-09-26 02:46:03
【问题描述】:

我在使用完一些 XML 文件后尝试删除它们,其中一个给我这个错误:

'delete': Permission denied - monthly-builds.xml (Errno::EACCES)

Ruby 声称该文件是写保护的,但我在尝试删除它之前设置了权限。

这就是我想要做的:

#collect the xml files from the current directory
filenames = Dir.glob("*.xml")

#do stuff to the XML files
finalXML = process_xml_files( filenames )

#clean up directory
filenames.each do |filename|
        File.chmod(777, filename) # Full permissions
        File.delete(filename)
end

有什么想法吗?

【问题讨论】:

  • 运行 Ruby 脚本的用户是否有权对文件执行chmod?这可能会默默地失败。
  • 我以管理员身份登录,我也是创建文件的人。所以我无法想象我没有权限的原因。

标签: ruby permissions chmod


【解决方案1】:

这个:

File.chmod(777, filename)

没有做你认为它做的事。来自fine manual

将命名文件上的权限位更改为mode_int表示的位模式。

强调我的。文件模式通常以八进制指定,因为这很好地将位分隔到三个 Unix 权限组(所有者、组、其他):

File.chmod(0777, filename)

因此,您实际上并没有将文件设置为完全访问权限,而是将权限位设置为 01411,结果如下:

-r----x--t

而不是

-rwxrwxrwx

你所期待的。请注意,您的(十进制)777 权限位图已删除写入权限。

此外,删除文件需要对该文件所在的目录具有写权限(至少在 Unixish 系统上),因此请检查该目录的权限。

最后,您可能想要检查来自File.chmod 的返回值:

[...] 返回处理的文件数。

仅仅因为你调用并不意味着它会成功。

【讨论】:

  • 谢谢,我没有看到关于它更改为位模式的部分。
【解决方案2】:

您可能无权运行chmod。您必须拥有该文件才能更改其权限。

文件也可能因在另一个应用程序中打开而被锁定。如果您在文本编辑器中查看文件,您可能无法删除它。

【讨论】:

  • 当我在 cygwin 中执行 ls -l 时,它会列出我以所有者身份创建的所有文件。
  • 另外,当我在 cygwin 中调用 chmod 777 *.xml 时,它会将权限设置为完整,所以我不明白为什么 ruby​​ 不能。
【解决方案3】:

就我而言,这是因为我一直试图删除的文件——kindle .sdr 记录——是目录,而不是文件。我需要改用这个:

FileUtils.rm_rf(dirname)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    相关资源
    最近更新 更多