#trie #file-path #directory-traversal #directory-tree #recursion #operations

fs-tree

Filesystem path Trie with an API focused on filesystem operations

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

#222 in Filesystem

Download history 100/week @ 2024-08-10 135/week @ 2024-08-17 174/week @ 2024-08-24 141/week @ 2024-08-31 113/week @ 2024-09-07 133/week @ 2024-09-14 173/week @ 2024-09-21 348/week @ 2024-09-28 177/week @ 2024-10-05 139/week @ 2024-10-12 188/week @ 2024-10-19 384/week @ 2024-10-26 128/week @ 2024-11-02 104/week @ 2024-11-09 144/week @ 2024-11-16 125/week @ 2024-11-23

530 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