存档文件在生成后立即复制时损坏

问题描述 投票:0回答:1

我是 Rust 的新手,每天都在学习它。
我写了一个代码来创建一个压缩的 tarball 并复制它自己。我在下面提到了。
https://rust-lang-nursery.github.io/rust-cookbook/compression/tar.html#compress-a-directory-into-tarball.
存档文件已正确生成,但复制的文件已损坏。无法提取。我不确定原因。
你有什么想法吗?

Cargo.toml

[dependencies]
tar = "0.4.38"
flate2 = "1.0.25"

main.rs

use flate2::{write::GzEncoder, Compression};
use std::fs::{self, File};

fn main() {
    let tar_gz = File::create("archive.tar.gz").unwrap();
    let enc = GzEncoder::new(tar_gz, Compression::default());
    let mut tar = tar::Builder::new(enc);
    // a directory including some files and directories
    tar.append_dir_all("target_dir", "target_dir").unwrap();
    tar.finish().unwrap();
    fs::copy("archive.tar.gz", "archive2.tar.gz").unwrap();
    // archive2.tar.gz is copied but broken
}

已解决:

感谢大家,解决了。谢谢!

tar.finish().unwrap();
drop(tar); // <-- added
fs::copy("archive.tar.gz", "archive2.tar.gz").unwrap();
rust gzip tar
1个回答
3
投票

复制前需要先致电

enc.flush()
。这确保了
GzEncoder
缓冲区中剩余的数据被写入文件。

由于

enc
已经为 tar 作者所有,您可以使用
into_inner
转换回
GzEncoder
并调用
tar.into_inner().flush()
.

© www.soinside.com 2019 - 2024. All rights reserved.