您需要告诉 Ruby 以二进制模式读取/写入文件。以下是主题的一些变体:
zip_fs.file.open(destination, 'wb') do |f|
File.open(file_name, 'rb') do |fi|
f.write fi.read
end
end
zip_fs.file.open(destination, 'wb') do |f|
f.write File.read(file_name, 'mode' => 'rb')
end
zip_fs.file.open(destination, 'wb') do |f|
f.write File.readbin(file_name)
end
代码的一个潜在问题是输入文件被 slurped,如果它大于可用空间,那将是一件坏事。最好以块的形式读取输入文件。这是未经测试的,但应该可以工作:
BLOCK_SIZE = 1024 * 1024
zip_fs.file.open(destination, 'wb') do |f|
File.open(file_name, 'rb') do |fi|
while (block_in = fi.read(BLOCK_SIZE)) do
f.write block_in
end
end
end
打开的文件永远不会关闭。使用 File.binread(file_name)
我的初始代码是为了表明需要使用二进制模式而编写的,并使用了open,因为它“更传统”,但忘记了使用块模式。我修改了我的示例代码来解决这个问题。
但是,当脚本结束时解释器关闭时,Ruby 会隐式关闭文件,这是发生的内务处理的一部分。但是,最好明确地close 文件。如果 OP 像我想的那样使用RubyZip,那么如果将块传递给open,就会自动发生这种情况。否则,read 和 readbin 都将读取到 EOF 并关闭文件。如果输入文件的大小未知或大于可用缓冲区空间,则使用这些方法的代码需要对读取块的需求敏感。