File.delete throws Errno:EACCESS Permission Denied in ruby -
the following code meant delete lines match regular expression fails
def delete_entry(name) puts "deleting #{name}.." if $debug begin file.open("#{@file_name}.tmp", 'w') |out_file| file.open(@file_name, 'r').each |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 the temporary file works fine. corresponding entries deleted properly. when try delete old file, , rename tmp new file, file.delete throws following: (line 56 call file#delete)
exception `errno::eacces' @ 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 any appreciated. on windows 7 using ntfs filesystem if helps matters.
edit: per az's suggestion in comments added:
objectspace.each_object(file) { |f| p f if f.path == @file_name && !f.closed? } just before call file.delete. output below:
c:\pickaxe>ruby phonebook.rb true enter 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' @ 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> the 2 lines prefixed # output of objectspace call.
i figured out stated last comment on original post. problem wasn't calling open block , therefore did not benefit automatic f.close comes using file.open block.
to remedy used file.open |file| file.each, instead of file.open(..).each
def delete_entry(name) puts "deleting #{name}.." if $debug begin file.open("#{@file_name}.tmp", 'w') |out_file| file.open(@file_name, 'r+') |file| file.each |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
Comments
Post a Comment