在Windows上使用Ruby读取PNG文件失败

我正在创build一个包含文本文件和图像文件的Zip文件。 代码在MacOS上运行时按预期工作,但在Windows上运行时会失败,因为图像文件内容读取不正确。

下面的代码段总是读取PNG图像文件作为'‰PNG',在Zip中为每个PNG图像添加一个5字节的文件。

这是关于Windows环境的问题吗?

zip_fs.file.open(destination, 'w') do |f| f.write File.read(file_name) end 

Solutions Collecting From Web of "在Windows上使用Ruby读取PNG文件失败"

从二进制文件压缩时为什么会损坏?

 io.get_output_stream(zip_file_path) do |out| out.write File.binread(disk_file_path) end 

您需要告诉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 

代码的一个潜在的问题是输入文件被篡改,如果它大于可用空间,将是一件坏事。 最好是以块的形式读取输入文件。 这是未经测试,但应该工作:

 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 ,这将自动发生。 否则, readreadbin都会读取到EOF并关闭文件。 如果输入文件是未知的大小或大于可用的缓冲区空间,则使用这些方法的代码需要对读取块的需求敏感。

我在阅读Lib文件时遇到类似的问题。 这是我的解决方案:

  File.open(path + '\Wall.Lib') 

路径对应于输入文件名的JavaScript文件。