Ruby tempfile实例在发布引用时自动删除其相应的文件。但是,我有一台机器不是这种情况。代码是
irb> require 'tempfile'
=> true
irb> t = Tempfile.new('test32')
=> #<File:/tmp/test32.27778.0>
irb> exit
在我的所有测试机器上,这导致test32被删除,除了一个。我试图使用File.delete
删除文件,不幸的是,它工作正常。我缺少一些ruby配置吗?
Ruby版本
ruby 1.8.6 (2009-06-08 patchlevel 369) [i686-linux].
编辑:在与DigitalRoss的对话中发现的一些其他信息:如果我明确发布Tempfile引用(t = nil),则会清除Tempfile。 GC是否可能以某种方式修补或更改?
这里有一些适用于“好”机器的代码,但是在“坏”机器上却失败了
include ObjectSpace
t = "blah"
define_finalizer(t, proc {|id| print "yes finalized id=#{id}", "\n" })
在糟糕的机器上,如果我明确地将t设置为nil,则仅打印“yes finalized”。
答案 0 :(得分:2)
好的,继续问题的评论主题......
Ruby,或者真的,Tempfile
,使用垃圾收集器来管理终结器。 (我假设它以这种方式工作而不是通过Kernel :: at_exit以便在长时间运行的ruby中删除文件。)无论如何,在一个系统上GC的某些东西似乎有所不同。让我们试着把它固定下来。试试这个,看看是否清除了对Tempfile实例的唯一引用并启动GC会删除该文件。
ross@deb:~$ irb
>> require 'tempfile'
=> true
>> $DEBUG=true
=> true
>> t=Tempfile.new('aaa')
=> #<File:/tmp/aaa20090905-21437-1d460as-0>
>> GC.start
=> nil
>> t=nil
=> nil
>> GC.start
removing /tmp/aaa20090905-21437-1d460as-0...done
=> nil
>> exit
ross@deb:~$
答案 1 :(得分:1)
在1.8.7中,终结器和垃圾收集器存在问题,听起来很可能是因为你在1.8.6中遇到了同样的问题。
我们设法通过猴子修补Tempfile来修复我们的rails应用程序中的问题。也可能为你工作。代码:http://github.com/jwinky/ruby_tempfile_ioerror