2013-03-28 26 views
1

我一直在试图获得一个(相对)简单的压缩和解压缩功能,适用于任何类型的对象(图像,CSV文件,文档等),并没有任何成功。Ruby zlib放气和膨胀不能按预期工作

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

Hoge.txt内容:

blahblah123 

红宝石放气类名为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 
与此代码

所以它的作用是创建一个名为.gz文件题为hoge.txt.gz它在命令提示符中生成这个

rubyfiletest.rb:9:in `read': No such file or directory - hoge.txt (Errno::ENOEN) 

此外,如果我尝试打开新创建的文件与Wi nrar/7zip的,它会给我这个错误:

The archive is either in unknown format or damaged. 

红宝石充气类名为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.txt.txt(DOH!),并一直在寻找这条道路hoge.txt。所以,现在我改变了红宝石压缩代码一点,这样的输出将创建一个由马修T.指出,一个有效的gzip文件

这是它看起来像现在

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 

以此为新rubyfiletest .RB类使用GzipWriter我收到此错误,当我运行这个类解:

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) 

我认为这些错误可能会导致数据不被复制?如果我使用了一个图片,假设这段代码能够工作,那么这些数据会被复制过来?

+0

使用File.expand_path('',__FILE__)打印,如果你在正确的目录/路径 –

+0

我用Dir.pwd和我确实在正确的路径(桌面)所有的文件(红宝石和文本文件)位于。 – Surep

+0

由于您似乎在Windows上,您是否有机会隐藏已知文件类型的扩展名?这会导致你的hoge.txt文件(如你在桌面上看到的)被命名为hoge.txt.txt。 –

回答

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 
+0

确实在正确的目录下,ruby文件和hoge.txt文件都在我的桌面上。 – Surep

+0

@Surep我复制了你的代码,将它放在一个包含hoge.txt文件的目录中,并且能够无任何错误地运行代码。 –

+0

因此,对于你来说它工作正常,它压缩数据,你也可以解压缩它? – Surep

0

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

+0

我这样做,并得到同样的问题,当运行命令“ruby ruby​​filetest.rb”我收到'读':没有这样的文件或目录 - hoge.txt(Errno:ENOENT) 仍然无法打开的问题仍然存在文件。 – Surep

+0

就像我说过的,_只要你过去找到hoge.txt_。这里没人能弄清楚为什么你找不到它。你需要解决这个问题。仔细检查位置,名称,案例(HOGE.TXT与hoge.txt)等。 –