20 releases (12 breaking)

0.13.0 Jan 27, 2026
0.12.1 Nov 8, 2025
0.12.0 Oct 14, 2025
0.11.0 Jul 27, 2025
0.1.0 Mar 20, 2017

#99 in Filesystem

Download history 304971/week @ 2025-10-22 302247/week @ 2025-10-29 303534/week @ 2025-11-05 294692/week @ 2025-11-12 312452/week @ 2025-11-19 277852/week @ 2025-11-26 332094/week @ 2025-12-03 346314/week @ 2025-12-10 331326/week @ 2025-12-17 251924/week @ 2025-12-24 292595/week @ 2025-12-31 427472/week @ 2026-01-07 406627/week @ 2026-01-14 485788/week @ 2026-01-21 488893/week @ 2026-01-28 561195/week @ 2026-02-04

2,021,924 downloads per month
Used in 61 crates (21 directly)

MIT license

245KB
5.5K SLoC

Contains (Cab file, 17KB) loop_in_chain, (Cab file, 17KB) tests/panics_fuzzed/alloc_panic, (Cab file, 17KB) tests/panics_fuzzed/minialloc_panic, (Cab file, 15KB) loop_in_alloc, (Cab file, 14KB) loop_in_directory, (Cab file, 15KB) loop_in_minialloc and 3 more.

rust-cfb

Build Status Crates.io Documentation

A Rust library for reading/writing Compound File Binary (structured storage) files. See MS-CFB for the format specification.

License

rust-cfb is made available under the MIT License.


lib.rs:

A library for reading/writing Compound File Binary (structured storage) files. See MS-CFB for the format specification.

A Compound File Binary (CFB) file, also called a structured storage file or simply a compound file, is a bit like a simple file system within a file. A compound file contains a tree of storage objects (i.e. directories), each of which can contain stream objects (i.e. files) or other storage objects. The format is designed to allow reasonably efficient in-place mutation and resizing of these stream and storage objects, without having to completely rewrite the CFB file on disk.

Example usage

use cfb;
use std::io::{Read, Seek, SeekFrom, Write};

// Open an existing compound file in read-write mode.
let mut comp = cfb::open_rw("path/to/cfb/file").unwrap();

// Read in all the data from one of the streams in that compound file.
let data = {
    let mut stream = comp.open_stream("/foo/bar").unwrap();
    let mut buffer = Vec::new();
    stream.read_to_end(&mut buffer).unwrap();
    buffer
};

// Append that data to the end of another stream in the same file.
{
    let mut stream = comp.open_stream("/baz").unwrap();
    stream.seek(SeekFrom::End(0)).unwrap();
    stream.write_all(&data).unwrap();
}

// Now create a new compound file, and create a new stream with the data.
let mut comp2 = cfb::create("some/other/path").unwrap();
comp2.create_storage("/spam/").unwrap();
let mut stream = comp2.create_stream("/spam/eggs").unwrap();
stream.write_all(&data).unwrap();

Dependencies

~260–500KB