2010-07-16 183 views
3

我覺得這將在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

回答

1

它確實在我看來,像你正在關閉你打開的文件句柄,然後再將它讀入回形針。

帶有塊的File.open()打開文件,將其傳遞到塊,並在塊執行後關閉它。這意味着它可能在您致電p.save之前關閉!

嘗試做所有你的照片創作的文件塊中:

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

感謝您的建議,雖然它現在似乎每次嘗試處理更多文件,但仍然失敗。 – pcg79 2010-07-18 19:33:08

相關問題