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

Popular posts from this blog

.htaccess - First slash is removed after domain when entering a webpage in the browser -

Automatically create pages in phpfox -

c# - Farseer ContactListener is not working -