2

クライアント サイトからいくつかの zip ファイルをダウンロードする単純な ftp クライアントを作成しました。すべての意図と目的のために、コードは次のようになります。

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 ボックスに移動すると、バイナリ データが破損し始め、書き込む前に一時ファイルを binmode に設定する必要がありました。

私の質問: zip ファイルが最初にダウンロードされて破損したときに行われたエンコード変換を「修正」または元に戻して、それらのファイルを元に戻し、基本的にエンコードからバイナリに戻す方法はありますか?

コードが実行されていた Windows ボックスからの詳細情報

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

1 に答える 1

1

ダウンロード中ではなく、ファイルへの保存中にデータが破損したと思います。

Windows では、テキスト ファイルの行は CR+LF で区切られます。ファイルをテキスト モードで開き、CR バイトを書き込むと、CR は自動的に CR+LF に置き換えられます。

zip ファイルはバイナリ ファイルです。それらを操作するには、バイナリ モードを使用します。

于 2013-06-05T22:58:48.560 に答える