用于 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 方法。