1

我一直在尝试让(相对)简单的压缩和解压缩功能适用于任何类型的对象(图像、csv 文件、文档等),但没有任何成功。

我已经尝试了很多事情,目前我认为这段代码很接近它(不是我的代码),但是我一直无法让它工作。

Hoge.txt 内容:

blahblah123

Ruby deflate 类名为 ruby​​filetest.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 类名为 ruby​​inflate.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 解压缩的新 ruby​​filetest.rb 类,我在运行此类时收到此错误:

rubyfiletest.rb:8 in 'write': closed stream (IOError)

这仍然会生成 .gz 文件(我现在可以在 winrar/7zip 中毫无问题地打开它,但是它是空的,应该包含“blahblah123”)。压缩它并运行 ruby​​inflate.rb 后,我从 ruby​​inflate.rb 收到此错误:

rubyinflate.rb:6 in 'read': unecpected end of file (Zlib::GzipFile::Error)

我认为这些错误可能导致数据无法复制?如果我使用图像,假设此代码有效,是否会复制该数据?

4

2 回答 2

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
于 2013-03-28T19:51:29.203 回答
0

既然你提到了winrar,听起来你在Windows上。一旦通过 find hoge.txt,您将需要一个"w+b", 而不是"w+"写入压缩数据时的模式。

于 2013-03-28T21:16:12.620 回答