15 releases

0.6.0 Oct 27, 2024
0.5.5 Oct 3, 2023
0.2.2 Aug 15, 2022
0.1.3 Apr 2, 2021
0.1.2 Mar 4, 2020

#615 in Filesystem

Download history 209/week @ 2025-03-08 282/week @ 2025-03-15 262/week @ 2025-03-22 117/week @ 2025-03-29 134/week @ 2025-04-05 142/week @ 2025-04-12 184/week @ 2025-04-19 244/week @ 2025-04-26 196/week @ 2025-05-03 248/week @ 2025-05-10 230/week @ 2025-05-17 177/week @ 2025-05-24 210/week @ 2025-05-31 172/week @ 2025-06-07 246/week @ 2025-06-14 330/week @ 2025-06-21

993 downloads per month

MIT license

62KB
960 lines

fs-tree

FsTree is a path Trie with an API focused on filesystem operations.

Clarifications:

  1. Unix only.
  2. This crate was transfered after 0.1.3, and changed its purpose.
  3. This crate refers to "filesystem tree" as the result you get from recursively traversing files:
    • If you try traversing a single file, you get a single node.
    • If you try traversing a directories, you might get a large subtree (of nodes).
    • This is agnostic to the underlying filesystem (nothing to do with ext4 or btrfs).
  4. Check Trie if you both haven't met yet.

Tree Layout:

A FsTree is a node with three possible file types:

use std::{collections::BTreeMap, path::PathBuf};

pub enum FsTree {
    Regular,
    Directory(TrieMap), // Recursive part
    Symlink(PathBuf),
}
//                                     ↓↓
pub type TrieMap = BTreeMap<PathBuf, FsTree>; // Recursive part

The root of the FsTree is unnamed (no filename/path), the "edges" to children are the relative paths.

Pitfall warning:

Like std functions, functions in this crate follow symlinks (and symlink chains), so you'll never get a FsTree::Symlink(_) in your tree! If you want symlink-awareness, use the function version with the symlink prefix (FsTree::read_at vs FsTree::symlink_read_at).

Ways to construct a FsTree:

  1. Read node/tree from path. (FsTree::symlink_read_at)
  2. Declare a FsTree literal. (tree!)
  3. Insert each node in an empty folder. (FsTree::new_dir + FsTree::insert)
  4. Parse from path text segments. (FsTree::from_path_text)

What you can do with a FsTree:

  1. Traverse, query, and modify it.
  2. Merge with another tree. (FsTree::try_merge)
  3. Write it to disk. (FsTree::write_at)
  4. Try loading a structural copy of it from a path. (FsTree::read_structure_at)
  5. (TODO) Compare with another FsTree, generating a DiffTree.
  6. (TODO) Add entry API.

Iterators:

See docs in the iter module.

Alternatives:

  • Crate walkdir - Better if you just need to iterate on filesystem trees.
  • Crate file_type_enum - If you want a shallow type enum.
  • Crate build-fs-tree - If you need to create a filesystem tree from a YAML file.

Dependencies

~110KB