2013-07-26 41 views
0

後,我寫了一個代碼文件指定給患者:沒有這樣的文件或目錄中刪除文件,Ruby on Rails的

file = Dir.entries('C:\Sites\what2\uploadnew').reject {|entry| entry == "." || entry == ".."} 

file.each do |f| 
    a = File.read('C:\Sites\what2\uploadnew' + '/' + f) + f 

    @patients.each do |patient| 
    if [patient.nachnahme, patient.vorname, patient.geburtsdatum].all? {|i| a.include? i } 
     first = Patient.find_by_id(patient.id) 
     second = first.images.create(:url => 'C:\Sites\what2\uploadsave' + '/' + f[0..-5] + '.tif') 
     File.delete 'C:/Sites/what2/uploadnew/' + f 
    end 
    end 
end 

就像你可以在代碼的末尾看到我刪除的文件:

File.delete 'C:/Sites/what2/uploadnew/' + f 

但不知怎的,這會導致問題。我得到的錯誤:

Errno::ENOENT in DocumentsController#index 

No such file or directory - C:/Sites/what2/uploadnew/filename.txt 

奇怪的是,該命令的工作原理和ruby真的刪除該文件。意味着該文件不能存在!那麼爲什麼要爲這個文件提供ruby?

+1

如果'@ patients.each'爲每個文件名運行多次,那麼您可能會嘗試多次刪除同一文件名。它會第一次成功,然後由於它已被刪除而在隨後的時間中失敗。因此,在'@ patients.each'的給定循環中,您的if必須不止一次成功,這會導致錯誤。 – lurker

+0

好吧,我會嘗試與存在? (文件名)謝謝 –

+1

我不確定你的邏輯在語義上是什麼意思,但簡單的解決方案是在你刪除它之前檢查文件的存在。 'file_name ='C:/ Sites/what2/uploadnew /'+ f'then'File.delete file_name if File.file? file_name'。 'file?'就像'exists?',但只有在它是普通文件(而不是目錄)時纔會成功。 – lurker

回答

1

我不確定你的邏輯在語義上是什麼意思,所以可能有文件刪除不應重複的原因,但簡單的解決方案是在刪除文件之前檢查文件是否存在。

file_name = 'C:/Sites/what2/uploadnew/' + f 
File.delete file_name if File.file? file_name 

因爲它是一個正常的文件,我建議使用.file?,而不是exists?

相關問題