频繁的“没有这样的文件或目录”,同时通过回形针保存文件

问题描述:

我觉得这将在facepalm时刻结束,但我一直在我的头上打了太久。频繁的“没有这样的文件或目录”,同时通过回形针保存文件

我有一个Rails seed.rb文件从一个特定的目录中创建的每个文件的新对象,并通过节省回形针的文件获取的所有文件:

Dir["./**/*.jpg"].each do |f| 
    ... 
    p = Picture.new 
    File.open(f, 'r') { |photo_file| p.photo = photo_file } 
    p.save! 
    .... 
end 

其中photo是回形针分配属性(picture.rb):

has_attached_file :photo, 
        :styles => { :medium => "500x500>", :thumb => "100x100#" }, 
        :processors => [:rotator] 

我的问题是在一些数量的文件(有时50,有时2)脚本,出现以下错误退出:

No such file or directory - /var/folders/oD/oDq1WD11EEaXmfi8VfNvfE+++TM/-Tmp-/stream,22423,0,22423,0 
/Users/patgeorge/.rvm/rubies/ruby-1.9.2-head/lib/ruby/1.9.1/fileutils.rb:1407:in `stat' 
/Users/patgeorge/.rvm/rubies/ruby-1.9.2-head/lib/ruby/1.9.1/fileutils.rb:1407:in `block in fu_each_src_dest' 
/Users/patgeorge/.rvm/rubies/ruby-1.9.2-head/lib/ruby/1.9.1/fileutils.rb:1423:in `fu_each_src_dest0' 
/Users/patgeorge/.rvm/rubies/ruby-1.9.2-head/lib/ruby/1.9.1/fileutils.rb:1405:in `fu_each_src_dest' 
/Users/patgeorge/.rvm/rubies/ruby-1.9.2-head/lib/ruby/1.9.1/fileutils.rb:504:in `mv' 
/Users/patgeorge/.rvm/gems/[email protected]/bundler/gems/paperclip-61f74de14812cabc026967a2b2c3ca8cbd2eed69-master/lib/paperclip/storage.rb:42:in `block in flush_writes' 

我想也许我没有关闭文件,但根据Ruby IO docs使用open的块将会关闭文件。

显然我没有看到自己必须经常运行它,所以这不是一个大问题。这只是令人沮丧和困惑。

我正在运行Ruby 1.9.2 r28142,Rails 3.0.0.beta4和Paperclip 2.3.3。

附加:

试图温菲尔德的建议,我的代码块现在看起来是这样的:

Dir["./**/*.jpg"].each do |f| 
    ... 
    File.open(f, 'r') do |photo_file| 
    p = Picture.new 
    p.photo = photo_file 
    p.save! 
    end 
    ... 
end 

仍能定期收到错误,虽然。

还有更多信息

我注意到,当我第一次运行我的脚本它能够完成大量的文件(12左右)。当我继续运行它时,数字会减少到我一次只能做2次的地方。我不确定我在做什么来使其“重置”和处理更多。但我认为这是关键。

+0

很难说,但我会添加类似' “do-end块中的”Rails.logger.debug(f)“',这样文件名就会出现在日志中。你或许可以弄清楚是什么原因造成的。 – Karl 2010-07-16 22:00:38

+0

@Karl对于失败的文件我没有看到任何突出的东西。事实上,重新运行脚本首先处理失败的文件,并且工作正常。 – pcg79 2010-07-18 19:30:03

这只猴子补丁解决了这个问题:

http://github.com/thoughtbot/paperclip/issues/issue/262/

+0

太棒了!谢谢! – pcg79 2010-09-23 15:26:01

它确实在我看来,像你正在关闭你打开的文件句柄,然后再将它读入回形针。

带有块的File.open()打开文件,将其传递到块,并在块执行后关闭它。这意味着它可能在您致电p.save之前关闭!

尝试做所有你的照片创作的文件块中:

File.open(f, 'r') {|photo_file| Picture.create!(:photo => photo_file) } 
+0

感谢您的建议,虽然它现在似乎每次尝试处理更多文件,但仍然失败。 – pcg79 2010-07-18 19:33:08