Rust如何实现zip压缩与解压

在Rust中如何实现文件的zip压缩与解压?有没有推荐的库或者标准库方法?希望能提供一个简单的代码示例说明基本用法,包括如何创建zip文件、添加文件到压缩包,以及如何解压zip文件到指定目录。另外,处理大文件时需要注意哪些性能问题?

2 回复

Rust中可用zip库实现压缩与解压:

压缩

use zip::write::FileOptions;
let file = File::create("test.zip")?;
let mut zip = zip::ZipWriter::new(file);
zip.start_file("data.txt", FileOptions::default())?;
zip.write_all(b"Hello World")?;

解压

let file = File::open("test.zip")?;
let mut zip = zip::ZipArchive::new(file)?;
let mut file = zip.by_name("data.txt")?;
let mut content = String::new();
file.read_to_string(&mut content)?;

需在Cargo.toml添加依赖:zip = "0.6"


在 Rust 中,可以使用 zip crate 实现 ZIP 文件的压缩与解压。以下是具体实现方法:

1. 添加依赖

Cargo.toml 中添加:

[dependencies]
zip = "0.6"

2. 解压 ZIP 文件

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

fn unzip_file(zip_path: &str, extract_to: &str) -> Result<(), Box<dyn std::error::Error>> {
    let file = File::open(zip_path)?;
    let mut archive = ZipArchive::new(file)?;
    
    for i in 0..archive.len() {
        let mut file = archive.by_index(i)?;
        let outpath = std::path::Path::new(extract_to).join(file.name());
        
        if file.name().ends_with('/') {
            std::fs::create_dir_all(&outpath)?;
        } else {
            if let Some(parent) = outpath.parent() {
                std::fs::create_dir_all(parent)?;
            }
            let mut outfile = File::create(&outpath)?;
            std::io::copy(&mut file, &mut outfile)?;
        }
    }
    Ok(())
}

3. 创建 ZIP 文件

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

fn create_zip(
    files: Vec<(&str, &[u8])>, 
    output_path: &str
) -> Result<(), Box<dyn std::error::Error>> {
    let file = File::create(output_path)?;
    let mut zip = ZipWriter::new(file);
    let options = SimpleFileOptions::default().compression_method(zip::CompressionMethod::Stored);
    
    for (filename, content) in files {
        zip.start_file(filename, options)?;
        zip.write_all(content)?;
    }
    
    zip.finish()?;
    Ok(())
}

4. 使用示例

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 解压示例
    unzip_file("example.zip", "extracted")?;
    
    // 压缩示例
    let files = vec![
        ("file1.txt", b"Hello World!"),
        ("file2.txt", b"Rust ZIP example"),
    ];
    create_zip(files, "output.zip")?;
    
    Ok(())
}

主要特性

  • 支持标准 ZIP 格式
  • 可设置压缩方法(Stored、Deflated 等)
  • 支持目录结构
  • 内存安全,无数据竞争

记得处理可能的错误,并根据需要调整压缩选项。

回到顶部