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 机器时,二进制数据开始损坏,我必须在写入之前将临时文件设置为 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 回答