Expand description
A ZIP archive encoder that never copies your data.
Feed it file content through a Stream or
write it directly with sendfile, mmap, or any I/O strategy you
like - cerniera only encodes the ZIP framing around it.
Cerniera (/t∫erˈnjɛra/) is Italian for zipper.
§Quick start
Feed a stream of ZipEntry items to ZipWriter and you get back a
byte stream you can write to a file, use as an HTTP response body, or
forward anywhere that accepts a Stream.
use std::{io, pin::pin};
use bytes::Bytes;
use cerniera::{MsDosDateTime, ZipEntry, ZipWriter};
use futures_util::{TryStreamExt, stream};
use tokio::{fs::File, io::AsyncWriteExt};
let modified = MsDosDateTime::new(2026, 3, 10, 12, 30, 0);
let entries = stream::iter([
Ok(ZipEntry::File {
path: "hello.txt".into(),
modified,
content: stream::iter([Ok::<_, io::Error>(Bytes::from_static(b"Hello, world!"))]),
}),
Ok(ZipEntry::Directory {
path: "subdir/".into(),
modified,
}),
]);
let mut zip_stream = pin!(ZipWriter::new(entries));
let mut file = File::create("output.zip").await?;
while let Some(chunk) = zip_stream.try_next().await? {
file.write_all(&chunk).await?;
}§Two API levels
-
ZipWriter- high-level streaming builder. Give it entries, get a byte stream. Handles CRC-32 and all ZIP bookkeeping automatically. Files are stored (uncompressed). -
ZipArchive- low-level, sans-IO encoder. Gives you full control over buffering and compression (DEFLATE, Zstandard, etc.) at the cost of a more manual lifecycle. See thedeflate_zipandsendfile_zipexamples.
§Features
std(default) - enables runtime SIMD detection for faster CRC-32.jiff- addsFrom<jiff::civil::DateTime>forMsDosDateTime.
Re-exports§
pub use self::archive::CompressionMethod;pub use self::archive::MsDosDateTime;pub use self::archive::ZipArchive;
Modules§
Structs§
- ZipWriter
- High-level streaming ZIP archive builder.