压缩和解压缩 tar.gz 文件

Lor*_*156 1 gzip tar rust

我正在尝试将目录压缩到tar.gz文件中,并在使用 Rust 后将其解压缩。我正在使用板条箱tar = "0.4.35"flate2 = "1.0.20". 我在 Windows 上。

我的代码与此处的示例几乎相同。

let tar = File::create("a.tar.gz").unwrap();
let enc = GzEncoder::new(tar, Compression::default());
let mut a = tar::Builder::new(enc);
a.append_dir_all("", "in").unwrap();
Run Code Online (Sandbox Code Playgroud)
let tar = File::open("a.tar.gz").unwrap();
let dec = GzDecoder::new(tar);
let mut a = Archive::new(dec);
a.unpack("out").unwrap();
Run Code Online (Sandbox Code Playgroud)

解压时总是报错: thread 'main' panicked at 'called Result::unwrap() on an Errvalue: Custom { kind: InvalidInput, error: TarError { desc: "failed to iterate over archive", io: Custom { kind: InvalidInput, error: "invalid gzip header" } } }', src\main.rs:21:26

我可以tar.gz毫无问题地打开 7-Zip 中生成的文件。我做错了什么还是板条箱有问题?

Lor*_*156 5

我发现问题了!

显然有读写编码器和解码器flate2。它们具有相同的名称,因此导入时无法轻松区分它们。你必须小心地导入正确的,否则你会得到奇怪的错误。

在我的示例中,我必须导入:

use flate2::write::{GzEncoder};
use flate2::read::{GzDecoder};
Run Code Online (Sandbox Code Playgroud)

  • 我去过那儿。我所做的不是“使用”它们并在任何地方编写完全限定的“flate2::read::GzDecoder”或“flate2::write::GzDecoder”以避免歧义。 (3认同)