簡體   English   中英

Ruby zlib deflate和inflate不能按預期工作

[英]Ruby zlib deflate and inflate not working as intended

我一直在嘗試(相對)簡單的壓縮和解壓縮功能來處理任何類型的對象(圖像,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.

名為rubyinflate.rb的Ruby膨脹類:

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壓縮代碼,以便輸出如Matthew 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

將此作為使用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)

我認為這些錯誤可能導致數據無法復制? 如果我使用圖像,那么假設此代碼有效,是否可以復制數據?

運行程序時,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

既然您提到了winrar,這聽起來好像您在Windows上。 一旦找到hoge.txt ,在寫入壓縮數據時,該模式將需要一個"w+b" ,而不是"w+"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM