用于在Rust中处理归档的zip库
在现代Rust开发中,经常需要将数据打包到ZIP归档中或从中提取数据。无论是创建备份、分发软件还是处理用户文件——zip库都是完成此任务的标准解决方案。它提供了用于读取、写入和修改ZIP归档的便捷API,同时支持流式处理和内存操作。
安装和引入
首先,将依赖项添加到您的Cargo.toml中:
[dependencies]zip = "2.1"可能还需要std::io crate来处理数据流,它已包含在Rust标准库中。
创建新的ZIP归档
考虑一个最简单的示例——创建一个包含单个文本文件的归档。为此,使用ZipWriter,它包装任何实现了Write的类型:
use std::fs::File;use std::io::Write;use zip::write::FileOptions;use zip::ZipWriter;
fn main() -> zip::result::ZipResult<()> { let file = File::create("example.zip")?; let mut zip = ZipWriter::new(file);
zip.start_file("hello.txt", FileOptions::default())?; zip.write_all(b"Hello, Rust ZIP!")?;
zip.finish()?; Ok(())}请注意start_file方法——它开始在归档内写入一个新文件。您可以向其传递压缩选项、修改日期和其他参数。
读取和提取文件
要读取归档,使用ZipArchive。它允许遍历所有条目并提取其内容:
use std::fs::File;use std::io::Read;use zip::ZipArchive;
fn main() -> zip::result::ZipResult<()> { let file = File::open("example.zip")?; let mut archive = ZipArchive::new(file)?;
for i in 0..archive.len() { let mut entry = archive.by_index(i)?; let name = entry.name().to_string(); let mut content = String::new(); entry.read_to_string(&mut content)?; println!("{}: {}", name, content); } Ok(())}by_index方法按索引返回特定条目。也可以通过by_name按名称搜索,但请注意——ZIP中的名称可能使用不同的编码。
向现有归档添加文件
zip库还支持向已创建的归档中添加新文件。这可以通过raw_copy_file方法或通过以追加模式打开归档来完成:
use std::fs::File;use std::io::Write;use zip::write::FileOptions;use zip::ZipWriter;
fn append_to_zip() -> zip::result::ZipResult<()> { let file = File::options() .read(true) .write(true) .open("example.zip")?; let mut zip = ZipWriter::new_append(file)?;
zip.start_file("new_file.txt", FileOptions::default())?; zip.write_all(b"Added later!")?;
zip.finish()?; Ok(())}重要提示:要添加文件,归档必须以读写权限打开,并且文件本身不能损坏。
使用不同的压缩类型
默认情况下,库使用Deflated方法(标准ZIP压缩)。您可以将其更改为Stored(无压缩)或其他方法,通过传递相应的选项:
use zip::CompressionMethod;use zip::write::FileOptions;
let options = FileOptions::default() .compression_method(CompressionMethod::Stored);// 或let options = FileOptions::default() .compression_method(CompressionMethod::Deflated);如果您需要最大压缩,请指定级别:
<