在Rust中使用ZIP归档:用于创建和解压归档的zip库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

用于在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);


如果您需要最大压缩,请指定级别:



<                    

推荐