Expand description
A unified interface for extracting common archive formats in-memory.
This crate provides a simple, safe API for extracting various archive formats including ZIP, TAR (with multiple compression options), 7-Zip, and single-file compression formats. All extraction happens in-memory without touching the disk.
§Features
- Unified API: Single interface for all archive formats
- In-memory extraction: No disk I/O required
- Safety limits: Protection against zip bombs and resource exhaustion
- Pure Rust: Minimal C dependencies (only bzip2)
- Cross-platform: Works on Linux, macOS, Windows (x86_64, ARM64)
§Supported Formats
- ZIP (
.zip
) - TAR (
.tar
,.tar.gz
,.tar.bz2
,.tar.xz
,.tar.zst
,.tar.lz4
) - 7-Zip (
.7z
) - Single-file compression (
.gz
,.bz2
,.xz
,.lz4
,.zst
)
§Examples
§Basic Usage
use archive::{ArchiveExtractor, ArchiveFormat};
use std::fs;
// Read archive file
let data = fs::read("example.zip")?;
// Create extractor with default settings
let extractor = ArchiveExtractor::new();
// Extract all files
let files = extractor.extract(&data, ArchiveFormat::Zip)?;
// Process extracted files
for file in files {
if !file.is_directory {
println!("File: {} ({} bytes)", file.path, file.data.len());
}
}
§Custom Size Limits
Protect against zip bombs and resource exhaustion:
use archive::{ArchiveExtractor, ArchiveFormat};
let extractor = ArchiveExtractor::new()
.with_max_file_size(50 * 1024 * 1024) // 50 MB per file
.with_max_total_size(500 * 1024 * 1024); // 500 MB total
let files = extractor.extract(&data, ArchiveFormat::Zip)?;
§Multiple Archive Formats
use archive::{ArchiveExtractor, ArchiveFormat};
let extractor = ArchiveExtractor::new();
// Extract ZIP archive
let zip_files = extractor.extract(&zip_data, ArchiveFormat::Zip)?;
// Extract TAR.GZ archive
let tar_files = extractor.extract(&targz_data, ArchiveFormat::TarGz)?;
// Extract 7-Zip archive
let seven_files = extractor.extract(&sevenz_data, ArchiveFormat::SevenZ)?;
// Decompress single gzip file
let gz_files = extractor.extract(&gz_data, ArchiveFormat::Gz)?;
§Safety
This crate includes built-in protections against:
- Zip bombs: Files that expand to enormous sizes
- Resource exhaustion: Configurable size limits
- Path traversal: Safe handling of archive paths
Default limits:
- Maximum file size: 100 MB
- Maximum total extraction size: 1 GB
§Error Handling
use archive::{ArchiveExtractor, ArchiveFormat, ArchiveError};
let extractor = ArchiveExtractor::new()
.with_max_file_size(1024 * 1024); // 1 MB limit
match extractor.extract(&data, ArchiveFormat::Zip) {
Ok(files) => println!("Extracted {} files", files.len()),
Err(ArchiveError::FileTooLarge { size, limit }) => {
eprintln!("File too large: {} bytes (limit: {})", size, limit);
}
Err(e) => eprintln!("Extraction failed: {}", e),
}
Re-exports§
pub use error::ArchiveError;
pub use error::Result;
pub use extractor::ArchiveExtractor;
pub use extractor::ExtractedFile;
pub use format::ArchiveFormat;