#recursion #path-buf #yielding

dowser

A recursive, canonicalizing file finding library for Unix

42 releases

Uses new Rust 2024

0.12.0 Feb 25, 2025
0.11.0 Dec 10, 2024
0.10.1 Nov 28, 2024
0.9.2 Jul 25, 2024
0.2.0 Mar 7, 2021

#262 in Filesystem

Download history 86/week @ 2024-12-04 86/week @ 2024-12-11 3/week @ 2024-12-18 15/week @ 2025-01-08 492/week @ 2025-01-29 46/week @ 2025-02-05 10/week @ 2025-02-12 52/week @ 2025-02-19 106/week @ 2025-02-26 3/week @ 2025-03-05 498/week @ 2025-03-19

651 downloads per month

WTFPL license

48KB
659 lines

Dowser

docs.rs changelog
crates.io ci deps.rs
license contributions welcome

Dowser is a(nother) fast, recursive file-finding library for Unix/Rust. It differs from Walkdir and kin in a number of ways:

  • It is not limited to one root; any number of file and directory paths can be loaded and traversed en masse;
  • Symlinks are followed by default, but can be disabled using Dowser::without_symlinks;
  • Hidden paths and mount points are traversed like anything else;
  • Matching file paths are canonicalized and deduped before yielding;

If those things sound nice, this library might be a good fit.

On the other hand, Dowser is optimized for file searching; the iterator crawls but does not yield directory paths, which could be bad if you need those too. Haha.

Installation

Add dowser to your dependencies in Cargo.toml, like:

[dependencies]
dowser = "0.12.*"

Example

All you need to do is chain Dowser::default with one or more of the following seed methods:

  • Dowser::with_path / Dowser::with_paths
  • Dowser::without_path / Dowser::without_paths

From there, you can apply any Iterator methods you want.

use dowser::Dowser;
use std::path::PathBuf;

// Return all files under "/usr/share/man".
let files1: Vec::<PathBuf> = Dowser::default()
    .with_path("/usr/share/man")
    .collect();

// Return only Gzipped files using callback filter.
let files1: Vec::<PathBuf> = Dowser::default()
    .with_path("/usr/share/man")
    .filter(|p|
        p.extension().is_some_and(|e| e.eq_ignore_ascii_case("gz"))
    )
    .collect();

Dependencies

~1.5MB
~19K SLoC