2013-06-05 38 views
2

我寫了一個簡單的ftp客戶端,它從客戶端下載一些zip文件。對於所有意圖和目的的代碼是這樣的:撤消編碼翻譯

ftp = Net::FTP.new 
ftp.connect 'ftp.server.com' 
ftp.login 'user', 'pwd' 
ftp.binary = true 
t = Tempfile.new 'file' 
ftp.getbinaryfile('remotefile', nil) {|data| t << data} 
t.close 
ftp.close 
FileUtils.mv t, '/path/to/file' 

這當它在Linux機器上運行跑好得很,但是當代碼得到了移動到Windows中的二進制數據開始變得損壞,我在寫入之前必須將tempfile設置爲binmode。

我的問題:有沒有什麼辦法可以「修復」或撤消在當zip文件最初下載和損壞,以獲取這些文件回來,從編碼回二進制基本上會在編碼翻譯?

從Windows的某些其它信息框中的代碼

t = Tempfile.new('file') 
t.external_encoding # -> nil 
t.internal_encoding # -> nil 
Encoding.default_internal # -> nil 
Encoding.default_external.name # -> "IBM437" 
+0

我認爲你可以重新讀取窗口框上的非二進制模式的文件,並用二進制模式再次寫出它。 – phoet

回答

1

正在運行,我認爲在保存到文件中,而不是在下載數據遭到損壞。

在Windows上,文本文件行用CR + LF分隔。如果以文本模式打開文件並將CR字節寫入文件,則CR會自動被CR + LF替換。

Zip文件是二進制文件。使用二進制模式來處理它們。

+0

謝爾蓋,你是絕對正確的,這是導致問題的EOL轉換,而不是編碼。我通過dos2unix運行了幾個損壞的zip文件,並能夠提取它們中的數據。謝謝! – jhulford