Ruby zlib放气和膨胀不按预期工作

时间:2013-03-28 19:40:13

标签: ruby compression zlib inflate deflate

我一直试图让(相对)简单的压缩和解压缩功能适用于任何类型的对象(图像,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

我猜测压缩无法正常工作,因为我甚至无法打开压缩文件并且一直存在这么多问题。我认为值得一提的是我是红宝石的新手。我还想知道实现它的方式是否能够使图像和所有类型的文件都能够被压缩/解压缩。

*更新*

我收到了错误路径的错误,因为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)

我认为这些错误可能导致数据无法复制?如果我使用了一个图像,假设这个代码有效,那么数据会被复制吗?

2 个答案:

答案 0 :(得分:1)

运行程序时,您的hoge.txt文件是否在当前目录中?在假设压缩和解压缩不起作用之前,我将尝试解决的第一件事是指示无法找到文件的大错误警告。我认为你会发现无法读取“压缩”文件,因为它是一个空文件。


解决程序无法找到hoge.txt文件后,您仍然会遇到输出问题。 Deflate不会创建gzip文件;它只进行压缩。 gzip文件中除了压缩数据之外还有更多内容。还有页眉和页脚信息。我建议您使用GzipWriter类而不是Deflate类。

require "zlib"

file_name = "hoge.txt"
compressed_file = File.open(file_name +".gz", "w+")

zd = Zlib::GzipWriter.new(compressed_file)

zd << File.read(file_name)
compressed_file.close

答案 1 :(得分:0)

既然你提到了winrar,那听起来就像是在Windows上。找到hoge.txt后,在编写压缩数据时,您需要"w+b",而不是"w+"