2012-02-29 38 views
1

我不是很熟悉ruby中的文件處理。我遇到的問題是讀取和寫入二進制文件不會生成完全相同的文件。Ruby文件副本產生不同的文件

clone = Tempfile.new(tempfile.original_filename)
FileUtils.copy_stream(tempfile, clone)
clone.flush

從下面的圖片很顯然,這不是一個確切的文件副本,當我嘗試在它的報告,該文件是一個圖像查看器打開新創建的文件腐敗。我試圖以不同的方式複製文件,如clone.write(tempfile.read)等,但沒有成功。

File compare *文件查看器還指出原始爲ANSI Dos/Windows,克隆爲ANSI Macintosh。文件大小也相差約200字節。

我想要完成的實際上只是使用Tempfile兩次。一個文件通過rails上傳並作爲Tempfile發給我。我想將它提交給兩個不同的寧靜服務,並且RestClient.post自動關閉文件。另一種選擇是將某些內存流克隆提交給RestClient,以便它不能關閉我的文件。如果我將File.open(tempfile.path)提交給RestClient,它會生成相同的損壞文件,這表明讀取是問題而不是寫入。如果我將原始的Tempfile對象提交給RestClient,它可以很好地工作,但它會被關閉並刪除,並且無法再發送它。

請幫忙!

問候,
皮埃爾

回答

3

這將是更有益的,看看這些文件的十六進制視圖,而不是一個文本編輯器的旅遊解說。我的猜測是,至少有一個文件不是以二進制模式打開的。在Ruby 1.9中,嘗試使用

open(filename, 'rb') 
open(filename, 'wb') 
Tempfile.new(filename, :binmode => true) 

分別用於打開文件以進行讀取/寫入和創建二進制臨時文件。

+0

謝謝,我的最終解決方案是我不創建另一個臨時文件,我只是在binmode中傳遞一個file.open。 – 2012-02-29 15:43:29