我正在尝试创建一个gzipped tar文件而不占用大量内存.我想要做的Bash相当于:
tar -cf - -C $INPUT . | gzip -cv - > $OUTPUT
Run Code Online (Sandbox Code Playgroud)
我正在使用tar和flate2库,它们都说它们支持流式传输.我无法弄清楚如何将一个流式传输到另一个.我曾尝试查看Write实现者,但没有看到符合我需求的流类型.
我当前的实现具有所需的输出(即.tar.gz文件),但它占用了大量的RAM,尤其是当文件大小很大时.当输入大小很大时,创建的文件也会提供"tar:存档中的意外EOF",但输入较小时会很好.这告诉我,它不像Bash那样管道流.
use flate2::write::GzEncoder;
use flate2::Compression;
use std::fs::File;
use tar::Builder;
// Create tar archive
let mut archive = Builder::new(Vec::new());
archive.append_dir_all("myfiles", "myfiles")?;
// Gzip tar archive and write to file
let compressed_file = File::create("backup.tar.gz")?;
let mut encoder = GzEncoder::new(compressed_file, Compression::Default);
encoder.write(&archive.into_inner()?)?;
encoder.finish()?;
Run Code Online (Sandbox Code Playgroud) rust ×1