From: Robert Klemme Date: 2007-07-12T23:01:52+09:00 Subject: Re: Tempfile : delete problem 2007/7/12, Ronald Fischer : > > > file=Tempfile.new('.tempreq','/thome/requests') > > > file << '....' # populate the file > > > path=file.path # remember the generated filename > > > file.close > > > result=path+'.xml' # add desired extension to the filename > > > File.rename(path,result) # rename file > > > at_exit { File::delete(result) } # remove file at exit > > > > > > When the exit handler jumps into action, I get however the following > > > error: > > > > > > H:\thome\grubylib/TfwCommon.rb:433:in `delete': Permission denied - > > > /thome/requests/.tempr > > > eq.3176.0.xml (Errno::EACCES) > > > > > > After the program has ended, I can however erase the file from the > > > command line with > > > no problems. Why do I get a "permission denied" here? Is > > there a better > > > way to > > > achieve my goal? > > > > I'd just use the block form: > > > > ruby -r tempfile -e 'Tempfile.open("foo", ".") {|io| io.puts 123}' > > > Hmmm... I don't see how this solves my file rename problem. Ah, my bad: I overread that one. File renaming is a bad idea with tempfiles. > Don't forget > that I need to rename the temporary file, so that it has the extension > .xml, before I continue processing it. The logic basically should go > like this (pseudocode): > > 1. create temporary file > 2. fill temporary file and close it > 3. rename it, so that it ends in .xml > 4. pass its file name to some library function, which processes the > file > 5. when my application exits, delete that xml file > > Tempfile::open with block argument performs steps 1 and 2 above, but > doesn't > tell me the name of the temporary file: > > x=Tempfile.open("foo", ".") {|io| io.puts 123} > x.class > => NilClass In that case rather use your own mechanism. That's too far away from tempfile's functionality. For example def tmp_xml(base, dir, mode) file_name = File.join(dir, "#{base}-#{rand 1000}.xml") begin File.open(file_name, mode) do |io| yield io, file_name end ensure File.unlink file_name if File.exists? file_name end end Then you can do tmp_xml ".", "foo", "rw" do |io, name| puts "file is #{name}" ... end Kind regards robert