繁体   English   中英

File.delete引发Errno:EACCESS权限在ruby中被拒绝

[英]File.delete throws Errno:EACCESS Permission Denied in ruby

以下旨在删除与正则表达式匹配的行的代码失败

def delete_entry(name)
    puts "Deleting #{name}.." if $DEBUG
    begin
      File.open("#{@file_name}.tmp", 'w') do |out_file|
        File.open(@file_name, 'r').each do |line|
          unless line =~ /^#{name},/
            out_file.print line
          else
            puts "Deleted #{line}!"
          end
        end
      end
      File.delete(@file_name)
      File.rename("#{@file_name}.tmp", @file_name)
    rescue Exception
      puts "Exception thrown in PhoneBook::delete_entry(#{name}): #{$!}"
    end
  end

临时文件可以正常工作。 相应的条目已正确删除。 但是,当我尝试删除旧文件并将tmp重命名为新文件时,File.delete引发以下内容:(第56行是对File#delete的调用)

Exception `Errno::EACCES' at PhoneBook.rb:56 - Permission denied - file-io-sampl
es/phonebooks/test.csv
Exception thrown in PhoneBook::delete_entry(Mike): Permission denied - file-io-s
amples/phonebooks/test.csv

任何帮助,将不胜感激。 如果有帮助的话,这是在Windows 7上使用NTFS文件系统的。

编辑:根据我在评论中添加的Az建议:

ObjectSpace.each_object(File) { |f| p f if f.path == @file_name && !f.closed? }

就在调用File.delete之前。 输出如下:

C:\Pickaxe>ruby PhoneBook.rb true
Enter a phonebook!
test.csv
Using test.csv..
Open Called!
Name: Richard Sex: Male Age: 22
Name: Midori Sex: Female Age: 22
Name: Mike Sex: Male Age:  18
Name: Richard Sex: Male Age: 44
Deleting Mike..
Deleted Mike,Male, 18
!
#<File:file-io-samples/phonebooks/test.csv>
#<File:file-io-samples/phonebooks/test.csv>
Exception `Errno::EACCES' at PhoneBook.rb:56 - Permission denied - file-io-sampl
es/phonebooks/test.csv
Exception thrown in PhoneBook::delete_entry(Mike): Permission denied - file-io-s
amples/phonebooks/test.csv

C:\Pickaxe>

带有#前缀的两行是ObjectSpace调用的输出。

我在对原始帖子发表最后评论时想出了这一点。 问题是我不是用块调用open,因此不能从使用File.open和块一起使用的自动f.close中受益。

为了解决这个问题,我使用File.open do | file | file.each,而不是File.open(..)。each

def delete_entry(name)
    puts "Deleting #{name}.." if $DEBUG
    begin
      File.open("#{@file_name}.tmp", 'w') do |out_file|
        File.open(@file_name, 'r+') do |file|
          file.each do |line|
            unless line =~ /^#{name},/
              out_file.print line
            else
              puts "Deleted #{line}!"
            end
          end
        end
      end
      ObjectSpace.each_object(File) { |f| p f if f.path == @file_name && !f.closed? } if $DEBUG
      File.delete(@file_name)
      File.rename("#{@file_name}.tmp", @file_name)
    rescue Exception
      puts "Exception thrown in PhoneBook::delete_entry(#{name}): #{$!}"
    end
  end

作为对自己尝试诊断错误时发现此错误的任何人的一般提示,请尝试首先通过命令行手动删除文件。 这可能表明您在文件上存在权限问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM