#directory #libc #recursion #iterator #walk

fts

A Rust library for high performance directory walking using libc fts

10 releases

Uses old Rust 2015

0.3.0 Mar 7, 2021
0.2.0 May 6, 2018
0.1.7 Apr 22, 2018
0.1.6 Mar 26, 2018
0.1.4 Mar 19, 2016

#894 in Filesystem

23 downloads per month

MIT/Apache

50KB
973 lines

fts-rs

Actions Status Crates.io Docs.rs codecov

A Rust library for high performance directory walking using libc fts.

Documentation

Usage

[dependencies]
fts = "0.3.0"

Example

Use WalkDir for directory walking:

use std::path::Path;
use fts::walkdir::{WalkDir, WalkDirConf};

let path = Path::new( "." );
for p in WalkDir::new( WalkDirConf::new( path ) ) {
    println!( "{:?}", p.unwrap() );
}

Call fts_* function directly:

use std::ffi::CString;
use fts::ffi::{fts_open, fts_read, fts_close, FTS_LOGICAL};

let path    = CString::new( "." ).unwrap();
let paths   = vec![path.as_ptr(), std::ptr::null()];
let fts     = unsafe { fts_open ( paths.as_ptr(), FTS_LOGICAL, None ) };
let _ftsent = unsafe { fts_read ( fts ) };
let _       = unsafe { fts_close( fts ) };

Benchmark

A cargo bench result is the following. fts_walkdir is this library, readdir is std::fs:read_dir, walkdir is walkdir::WalkDir. a suffix _metadata means using call DirEntry::metadata().

test fts_walkdir          ... bench: 315,114,126 ns/iter (+/- 8,478,709)
test fts_walkdir_metadata ... bench: 480,089,245 ns/iter (+/- 11,478,335)
test readdir              ... bench: 575,856,224 ns/iter (+/- 15,021,486)
test readdir_metadata     ... bench: 790,838,218 ns/iter (+/- 12,780,010)
test walkdir              ... bench: 688,884,058 ns/iter (+/- 8,023,838)
test walkdir_metadata     ... bench: 904,379,691 ns/iter (+/- 10,212,776)

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~0.6–2.2MB
~32K SLoC