3

次のRubyコードでファイルを解凍しようとしています。

File.open("file_compressed.gz") do |compressed|
  File.open("file_decomp","w") do |decompressed|
    gz = Zlib::GzipReader.new(compressed)
    result = gz.read
    decompressed.write(result)
    gz.close
  end
end

しかし、私は次のエラーが発生しています-

 not in gzip format (Zlib::GzipFile::Error)
 ./features/support/abc/abc_file.rb:44:in `initialize'

Macでgzipコマンドを使用して同じファイルを解凍すると、正しい非圧縮出力が生成されました。次のコマンドについては、私は見ることができます-

 $file file_compressed.gz
 file_compressed.gz: gzip compressed data, from FAT filesystem (MS-DOS, OS/2, NT)

Zlibで圧縮ファイルを作成するときにヘッダーデータを配置する必要がありますか?GzipReaderの代わりにinflateメソッドを使用すると、次のエラーが発生するためです-

 incorrect header check (Zlib::DataError)
  ./features/support/abc/abc_file.rb:69:in `inflate'
4

1 に答える 1

2

LF区切り文字を使用しないがCR+LFを使用しているプラ​​ットフォームを使用している場合は、読み取りのためにファイルをバイナリモードで開く必要がある場合があります。

File.open("file_compressed.gz", "rb") do |compressed|
  # ...
end

これにより、入力ストリームを8ビットバイナリ以外のものとして解釈することも回避できます。

"wb"フラグと同じ方法で出力ファイルを開くようにしてください。

于 2012-09-25T19:20:14.433 に答える