如何使用Rust的zip库处理压缩文件

最近在学习Rust处理压缩文件,发现有个zip库好像挺方便的。想请教下具体该怎么使用这个库来解压和创建zip文件?比如如何读取zip文件中的内容列表,或者如何把多个文件打包成一个新的zip压缩包?最好能提供一些简单的代码示例说明基本用法。另外这个库有什么需要特别注意的坑吗?

2 回复

使用Rust处理压缩文件,推荐使用zip库。首先在Cargo.toml中添加依赖:

[dependencies]
zip = "0.6"

读取压缩文件示例:

use std::fs::File;
use zip::ZipArchive;

let file = File::open("archive.zip")?;
let mut archive = ZipArchive::new(file)?;

for i in 0..archive.len() {
    let mut file = archive.by_index(i)?;
    println!("文件名: {}", file.name());
    
    // 解压到内存
    let mut contents = String::new();
    file.read_to_string(&mut contents)?;
}

创建压缩文件示例:

use std::fs::File;
use zip::{ZipWriter, write::FileOptions};

let file = File::create("output.zip")?;
let mut zip = ZipWriter::new(file);

let options = FileOptions::default()
    .compression_method(zip::CompressionMethod::Stored);

zip.start_file("data.txt", options)?;
zip.write_all(b"Hello World")?;
zip.finish()?;

主要特点:

  • 支持读取/写入ZIP文件
  • 支持存储/压缩方法
  • 可处理加密文件(有限支持)
  • 内存友好,支持流式处理

注意处理可能的错误,如文件损坏、权限问题等。


在Rust中处理压缩文件,推荐使用 zip crate。以下是基本使用方法:

1. 添加依赖

Cargo.toml 中添加:

[dependencies]
zip = "0.6"

2. 读取压缩文件

use std::fs::File;
use zip::ZipArchive;

fn read_zip_file() -> Result<(), Box<dyn std::error::Error>> {
    let file = File::open("example.zip")?;
    let mut archive = ZipArchive::new(file)?;
    
    for i in 0..archive.len() {
        let mut file = archive.by_index(i)?;
        println!("文件名: {}", file.name());
        
        // 读取文件内容
        let mut contents = String::new();
        file.read_to_string(&mut contents)?;
        println!("内容: {}", contents);
    }
    Ok(())
}

3. 创建压缩文件

use std::fs::File;
use zip::{ZipWriter, write::FileOptions};

fn create_zip_file() -> Result<(), Box<dyn std::error::Error>> {
    let file = File::create("output.zip")?;
    let mut zip = ZipWriter::new(file);
    
    let options = FileOptions::default()
        .compression_method(zip::CompressionMethod::Stored);
    
    // 添加文本文件
    zip.start_file("hello.txt", options)?;
    zip.write_all(b"Hello, World!")?;
    
    // 添加二进制文件
    zip.start_file("data.bin", options)?;
    zip.write_all(&[1, 2, 3, 4, 5])?;
    
    zip.finish()?;
    Ok(())
}

4. 提取所有文件

use std::fs;
use std::path::Path;

fn extract_zip() -> Result<(), Box<dyn std::error::Error>> {
    let file = File::open("example.zip")?;
    let mut archive = ZipArchive::new(file)?;
    
    let extract_to = Path::new("extracted");
    if !extract_to.exists() {
        fs::create_dir_all(extract_to)?;
    }
    
    archive.extract(extract_to)?;
    Ok(())
}

主要特性

  • 支持读取和写入ZIP文件
  • 支持多种压缩方法(Stored、Deflate等)
  • 可处理加密文件(有限支持)
  • 支持ZIP64格式

使用前请确保处理可能的错误,特别是文件不存在或格式不正确的场景。

回到顶部