9 个版本

0.1.9 2023 年 12 月 8 日
0.1.8 2023 年 12 月 6 日
0.1.3 2023 年 11 月 29 日

#427 in 文件系统

MIT/Apache

21KB
187 代码行

dir_walker

github build status crates.io docs.rs

此包提供了一种方便的方式递归遍历目录。由于 Entry 是基于 std::fs::DirEntry 的,因此此包中的对象可以与标准库类型(如 std::fs::*)无缝使用。该包的目标是提供一个具有保证顺序和可序列性的文件系统表示,以便通过网络发送序列化对象。

特性

  • Entry 是一个内存中的递归结构,保证在遍历过程中找到的路径的顺序。顺序是字母顺序,目录在前,文件在后。为了限制内存消耗,默认情况下,访问过的最大条目数限制为 10k,遍历的最大深度限制为 100。这些限制可以通过 max_entriesmax_depth 方法更改。
  • Entry 可以用来构建可序列化的对象,例如作为 Json。
  • 跳过符号链接。

使用

此包的入口点是 Walker(构建器)结构。使用 new 函数,将遍历的入口点作为输入传递给 Walker 以配置它。然后可以指定多个选项

  • 使用 skip_dotted 方法在遍历时跳过点文件或目录。
  • skip_directories 方法允许跳过目录。
  • 使用 max_depth 在固定深度停止遍历。
  • 使用 max_entries 在遍历过程中设置访问过的最大条目数。

上述所有选项都是可选的。设置选项后,使用 walk_dirroot 开始遍历文件系统。

遍历的结果是一个递归构建的 Entry 对象,它在其 dirent 字段中公开其信息,并在 children 字段中列出其依赖项。或者,Entry 对象的 iterator 可以访问一个包含条目的平面列表。

将此软件包添加到您的项目中

[dependencies]
dir_walker = "0.1.9"

示例

使用示例在 测试文件夹 中。

最小示例

    use dir_walker::Walker;

    let root = "./";
    let walker = Walker::new(root);
    let entries = walker.walk_dir().unwrap();

    // prints a depth first representation of the root directory
    entries.into_iter().for_each(|e| println!("{e:?}"));

使用选项

    use dir_walker::Walker;

    let root = "./";
    let skip = ["./target"];
    let entries = Walker::new(root)
        .skip_directories(&skip)
        .skip_dotted()
        .walk_dir()
        .unwrap();

    entries.into_iter().for_each(|e| println!("{e:?}"));

打印

EntryIterator { dirent: DirEntry("./src"), depth: 0 }
EntryIterator { dirent: DirEntry("./src/lib.rs"), depth: 1 }
EntryIterator { dirent: DirEntry("./tests"), depth: 0 }
EntryIterator { dirent: DirEntry("./tests/walkdir.rs"), depth: 1 }
EntryIterator { dirent: DirEntry("./Cargo.lock"), depth: 0 }
EntryIterator { dirent: DirEntry("./Cargo.toml"), depth: 0 }
EntryIterator { dirent: DirEntry("./README.md"), depth: 0 }

无运行时依赖