File.delete上的Ruby(Errno :: EACCES)

时间:2011-06-30 15:42:19

标签: ruby permissions chmod

我尝试在使用完毕后删除一些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

有什么想法吗?

3 个答案:

答案 0 :(得分:6)

此:

File.chmod(777, filename)

不符合您的想法。来自fine manual

  

将指定文件上的权限位更改为mode_int所代表的位模式。

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

File.chmod(0777, filename)

因此,您实际上并未将文件设置为完全访问权限,而是将权限位设置为01411,如下所示:

-r----x--t

而不是

-rwxrwxrwx

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

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

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

  

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

仅仅因为你打电话并不意味着它会成功。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

在我的情况下,这是因为我试图删除的文件 - kindle .sdr记录 - 是目录,而不是文件。我需要改用它:

FileUtils.rm_rf(dirname)