Rust 7z压缩解压库sevenz-rust的使用:高效处理7z格式文件的Rust插件库
Rust 7z压缩解压库sevenz-rust的使用:高效处理7z格式文件的Rust插件库
这是一个用纯Rust编写的7z压缩/解压器,很大程度上受到了apache commons-compress项目的启发。
LZMA/LZMA2解码器和所有过滤器代码都是从tukaani xz for java移植过来的。
解压缩
支持的编解码器:
- ✔️ BZIP2 (需要’bzip2’特性)
- ✔️ COPY
- ✔️ LZMA
- ✔️ LZMA2
- ✔️ ZSTD (需要’zstd’特性)
支持的过滤器:
- ✔️ BCJ X86
- ✔️ BCJ PPC
- ✔️ BCJ IA64
- ✔️ BCJ ARM
- ✔️ BCJ ARM_THUMB
- ✔️ BCJ SPARC
- ✔️ DELTA
- ✔️ BJC2
使用
在Cargo.toml中添加依赖:
[dependencies]
sevenz-rust={version="0.2"}
将源文件"data/sample.7z"解压到目标路径"data/sample":
sevenz_rust::decompress_file("data/sample.7z", "data/sample").expect("complete");
解压加密的7z文件
添加’aes256’特性:
[dependencies]
sevenz-rust={version="0.2", features=["aes256"]}
sevenz_rust::decompress_file_with_password(
"path/to/encrypted.7z",
"path/to/output",
"password".into()
).expect("complete");
多线程解压
参考examples/mt_decompress.rs
压缩
目前仅支持LZMA2方法。
[dependencies]
sevenz-rust={version="0.5.0", features=["compress"]}
使用辅助函数创建7z文件:
sevenz_rust::compress_to_path(
"examples/data/sample",
"examples/data/sample.7z"
).expect("compress ok");
使用AES加密
需要版本>=0.3.0
[dependencies]
sevenz-rust={version="0.5", features=["compress","aes256"]}
使用辅助函数创建带密码的7z文件:
sevenz_rust::compress_to_path_encrypted(
"examples/data/sample",
"examples/data/sample.7z",
"password".into()
).expect("compress ok");
高级用法
[dependencies]
sevenz-rust={version="0.5.0", features=["compress","aes256"]}
固体压缩
use sevenz_rust::*;
let mut sz = SevenZWriter::create("dest.7z").expect("create writer ok");
sz.push_source_path("path/to/compress", |_| true).expect("pack ok");
sz.finish().expect("compress ok");
压缩方法
带加密和lzma2选项:
use sevenz_rust::*;
let mut sz = SevenZWriter::create("dest.7z").expect("create writer ok");
sz.set_content_methods(vec![
sevenz_rust::AesEncoderOptions::new("sevenz-rust".into()).into(),
lzma::LZMA2Options::with_preset(9).into(),
]);
sz.push_source_path("path/to/compress", |_| true).expect("pack ok");
sz.finish().expect("compress ok");
完整示例代码
基础解压示例
use sevenz_rust::decompress_file;
fn main() {
// 解压7z文件
decompress_file("test.7z", "output_dir").expect("解压失败");
println!("解压成功!");
}
带密码解压示例
use sevenz_rust::decompress_file_with_password;
fn main() {
// 解压加密的7z文件
decompress_file_with_password(
"encrypted.7z",
"output_dir",
"mypassword".into()
).expect("解压失败");
println!("解压成功!");
}
基础压缩示例
use sevenz_rust::compress_to_path;
fn main() {
// 压缩文件夹
compress_to_path("source_dir", "output.7z").expect("压缩失败");
println!("压缩成功!");
}
带密码压缩示例
use sevenz_rust::compress_to_path_encrypted;
fn main() {
// 加密压缩文件夹
compress_to_path_encrypted(
"source_dir",
"output.7z",
"mypassword".into()
).expect("压缩失败");
println!("加密压缩成功!");
}
高级压缩配置示例
use sevenz_rust::*;
use sevenz_rust::lzma;
fn main() {
// 创建7z写入器
let mut sz = SevenZWriter::create("advanced.7z").expect("创建写入器失败");
// 设置压缩方法(AES加密+LZMA2)
sz.set_content_methods(vec![
AesEncoderOptions::new("password123".into()).into(),
lzma::LZMA2Options::with_p preset(9).into(),
]);
// 添加要压缩的路径
sz.push_source_path("data_to_compress", |_| true).expect("添加压缩内容失败");
// 完成压缩
sz.finish().expect("压缩失败");
println!("高级压缩成功!");
}
1 回复
Rust 7z压缩解压库sevenz-rust的使用指南
简介
sevenz-rust是一个用于处理7z格式文件的纯Rust库,提供了压缩和解压7z文件的功能。它不依赖外部二进制文件或系统库,完全在Rust生态中实现。
主要特性
- 支持7z格式的压缩和解压
- 纯Rust实现,无外部依赖
- 支持多种压缩算法(LZMA/LZMA2等)
- 支持密码保护的压缩文件
- 跨平台支持
安装
在Cargo.toml中添加依赖:
[dependencies]
sevenz-rust = "0.2"
基本使用方法
解压7z文件
use sevenz_rust::SevenZArchive;
use std::path::Path;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 解压文件
SevenZArchive::extract(
Path::new("archive.7z"),
Path::new("output_dir")
)?;
Ok(())
}
带密码解压
use sevenz_rust::{SevenZArchive, Password};
fn main() -> Result<(), Box<dyn std::error::Error>> {
SevenZArchive::extract_with_password(
"archive.7z",
"output_dir",
Password::from("mypassword")
)?;
Ok(())
}
创建7z压缩文件
use sevenz_rust::{SevenZArchive, SevenZArchiveEntry, SevenZMethod};
use std::path::Path;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut archive = SevenZArchive::create("output.7z")?;
// 添加文件到压缩包
archive.push_archive_entry(
SevenZArchiveEntry::from_path(Path::new("file1.txt"), "file1.txt")?
.set_method(SevenZMethod::LZMA)
);
// 添加整个目录
archive.push_source_dir(Path::new("docs"), "docs")?;
archive.write()?;
Ok(())
}
带密码压缩
use sevenz_rust::{SevenZArchive, SevenZArchiveEntry, SevenZMethod, Password};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut archive = SevenZArchive::create_with_password(
"secure.7z",
Password::from("secret123")
)?;
archive.push_archive_entry(
SevenZArchiveEntry::from_path("sensitive.txt", "sensitive.txt")?
.set_method(SevenZMethod::LZMA2)
);
archive.write()?;
Ok(())
}
高级用法
自定义压缩参数
use sevenz_rust::{SevenZArchive, SevenZArchiveEntry, SevenZMethod, SevenZWriterOptions};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let options = SevenZWriterOptions {
method: SevenZMethod::LZMA2,
level: 9, // 压缩级别 1-9
..Default::default()
};
let mut archive = SevenZArchive::create_with_options("custom.7z", options)?;
archive.push_archive_entry(
SevenZArchiveEntry::from_path("large_file.bin", "large_file.bin")?
);
archive.write()?;
Ok(())
}
处理大文件
use sevenz_rust::{SevenZArchive, SevenZArchiveEntry, SevenZMethod};
use std::fs::File;
use std::io::{self, BufReader};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut archive = SevenZArchive::create("large_files.7z")?;
// 使用流式处理大文件
let file = File::open("very_large_file.bin")?;
let reader = BufReader::new(file);
archive.push_archive_entry(
SevenZArchiveEntry::from_reader(reader, "very_large_file.bin")?
.set_method(SevenZMethod::LZMA2)
);
archive.write()?;
Ok(())
}
完整示例
下面是一个完整的示例,演示如何压缩一个目录并设置密码保护:
use sevenz_rust::{SevenZArchive, SevenZArchiveEntry, SevenZMethod, Password};
use std::path::Path;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 创建带密码的7z压缩文件
let mut archive = SevenZArchive::create_with_password(
"backup.7z",
Password::from("mysecurepassword")
)?;
// 添加单个文件
archive.push_archive_entry(
SevenZArchiveEntry::from_path(Path::new("important.txt"), "important.txt")?
.set_method(SevenZMethod::LZMA2)
);
// 添加整个目录
archive.push_source_dir(Path::new("data"), "backup_data")?;
// 写入压缩文件
archive.write()?;
println!("压缩完成!");
Ok(())
}
注意事项
- 对于非常大的文件,考虑使用流式处理以避免内存问题
- 密码保护的7z文件使用AES-256加密
- 目前不支持多卷压缩文件
- 解压进度可以通过实现
Progress
trait来监控
sevenz-rust库提供了简单而强大的接口来处理7z文件,适合需要纯Rust解决方案的项目。