我一直在尝试让(相对)简单的压缩和解压缩功能适用于任何类型的对象(图像、csv 文件、文档等),但没有任何成功。
我已经尝试了很多事情,目前我认为这段代码很接近它(不是我的代码),但是我一直无法让它工作。
Hoge.txt 内容:
blahblah123
Ruby deflate 类名为 rubyfiletest.rb:
require "zlib"
file_name = "hoge.txt"
compressed_file = File.open(file_name +".gz", "w+")
zd = Zlib::Deflate.new(Zlib::BEST_COMPRESSION, 15, Zlib::MAX_MEM_LEVEL, Zlib::HUFFMAN_ONLY)
compressed_file << zd.deflate(File.read(file_name))
compressed_file.close
zd.close
因此,使用此代码它所做的是创建一个名为 hoge.txt.gz 的 .gz 文件,该文件在命令提示符下生成此文件
rubyfiletest.rb:9:in `read': No such file or directory - hoge.txt (Errno::ENOEN)
此外,如果我尝试使用 winrar/7zip 打开新创建的文件,它会给我这个错误:
The archive is either in unknown format or damaged.
Ruby inflate 类名为 rubyinflate.rb:
require 'zlib'
File.open('hoge.txt.gz', 'rb') do |compressed|
File.open('hoge.txt', 'w') do |decompressed|
gz = Zlib::GzipReader.new(compressed)
result = gz.read
decompressed.write(result)
gz.close
end
end
我猜压缩无法正常工作,因为我什至无法打开压缩文件并且遇到了很多问题。我认为值得一提的是我是 ruby 新手。我还想知道这种实现方式是否可以使图像和所有类型的文件都可以很好地压缩/解压缩。
* 更新 *
我收到错误路径的错误,因为 hoge 被保存为 hoge.txt.txt (doh!)并且它正在该路径中寻找 hoge.txt。所以现在我稍微更改了 ruby 压缩代码,以便输出创建一个有效的 gzip 文件,正如 Matthew T 所指出的那样。
这是现在的样子
require "zlib"
file_name = "hoge.txt"
compressed_file = File.open(file_name +".gz", "w+b")
zd = Zlib::GzipWriter.new(compressed_file)
zd << File.read(file_name)
compressed_file.close
zd.close
将此作为使用 GzipWriter 解压缩的新 rubyfiletest.rb 类,我在运行此类时收到此错误:
rubyfiletest.rb:8 in 'write': closed stream (IOError)
这仍然会生成 .gz 文件(我现在可以在 winrar/7zip 中毫无问题地打开它,但是它是空的,应该包含“blahblah123”)。压缩它并运行 rubyinflate.rb 后,我从 rubyinflate.rb 收到此错误:
rubyinflate.rb:6 in 'read': unecpected end of file (Zlib::GzipFile::Error)
我认为这些错误可能导致数据无法复制?如果我使用图像,假设此代码有效,是否会复制该数据?