在 Rust 中使用 ZIP/归档:zip 库及完整指南

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

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

开始课程

用于 Rust 的 zip 库:使用 ZIP 归档的完整指南



在现代 Rust 开发中,处理归档是一项常见任务。无论是打包日志、解压配置还是创建备份,标准库 zip(crate zip)都是读写 ZIP 文件的事实标准。在本文中,我们将详细介绍如何安装该库、创建归档、提取文件,并探讨高级技术:密码处理、流处理和大数据操作。



安装与引入



在 Cargo.toml 中添加依赖:



[dependencies]zip = "2.1"


之后,在代码中导入必要的模块:



use std::fs::File;use std::io::{Read, Write, BufReader, BufWriter};use zip::ZipWriter;use zip::write::FileOptions;use zip::read::ZipArchive;


创建 ZIP 归档



使用 ZipWriter 创建新归档。我们来看一个基本示例——打包两个文本文件:



use std::fs::File;use std::io::Write;use zip::ZipWriter;use zip::write::FileOptions;

fn create_archive() -> 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 archive!")?;

// 添加第二个文件并启用压缩 let options = FileOptions::default() .compression_method(zip::CompressionMethod::Deflated) .unix_permissions(0o755); zip.start_file("data/config.json", options)?; zip.write_all(b"{\\"version\\": 1}")?;

zip.finish()?; Ok(())}


重要提示: start_file 方法在归档内打开一个新文件。选项允许您指定压缩方法(默认是 Stored——不压缩,Deflated——标准 ZIP 压缩)。



读取和解压归档



使用 ZipArchive 进行读取。下面是一个函数,它列出文件并将其解压到当前目录:



use std::fs::File;use std::io::{Read, BufReader};use zip::ZipArchive;

fn extract_archive() -> zip::result::ZipResult<()> { let file = File::open("example.zip")?; let reader = BufReader::new(file); let mut archive = ZipArchive::new(reader)?;

for i in 0..archive.len() { let mut entry = archive.by_index(i)?; let name = entry.name().to_string(); println!("正在解压: {}", name);

// 在磁盘上创建文件 let mut output = File::create(&name)?; std::io::copy(&mut entry, &mut output)?; } Ok(())}


by_index 方法返回一个遍历条目的迭代器。如果需要按名称访问,请使用 by_name("path/to/file.txt")。请注意:ZIP 中的名称可能包含以 / 分隔的路径——这对于跨平台兼容性是正常的。



密码处理(加密)



zip 库支持基于密码的加密,通过 AES 算法(默认为 AES-256)。创建加密归档:



use zip::ZipWriter;use zip::write::FileOptions;use zip::AesMode;

fn create_encrypted_archive() -> zip::result::ZipResult<()> { let file = File::create("secret.zip")?; let mut zip = ZipWriter::new(file);

let options = FileOptions::default() .compression_method(zip::CompressionMethod::Deflated) .with_aes_encryption(AesMode::Aes256, "my_strong_password");

zip.start_file("secret.txt", options)?; zip.write_all(b"Top secret data")?; zip.finish()?; Ok(())}


要读取加密归档,请将密码传递给 by_index_decrypt 或 by_n 方法。

推荐