#file-copy #fs-file #progress #file-io #fs #copy #io-error

fs-more

基于 std::fs 的便捷文件和目录操作,具有进度报告功能

11 个版本 (5 个重大更新)

0.7.1 2024 年 8 月 8 日
0.7.0 2024 年 8 月 8 日
0.6.1 2024 年 7 月 10 日
0.6.0 2024 年 6 月 16 日
0.2.2 2024 年 1 月 13 日

#196文件系统

Download history 421/week @ 2024-06-10 90/week @ 2024-06-17 4/week @ 2024-06-24 19/week @ 2024-07-01 100/week @ 2024-07-08 4/week @ 2024-07-15 35/week @ 2024-07-29 204/week @ 2024-08-05 20/week @ 2024-08-12

每月 259 次下载

MIT/Apache

300KB
4K SLoC

fs-more

Crates.io Version Minimum Supported Rust Version is 1.77.0 License Documentation

基于 std::fs 的便捷文件和目录操作,具有改进的错误处理和深入配置功能。包括具有进度报告的文件或目录的复制和移动。

主要功能

  • 使用以下配置选项复制或移动文件或目录
    • (现有目标文件行为、复制深度、I/O 缓冲区大小等),以及
    • 进度报告(如果需要的话),
  • 扫描目录(具有扫描深度和符号链接行为等选项),以及
  • 计算文件或目录大小。

用法

要将 fs-more 添加到您的项目中,请将其指定为 Cargo.toml 文件中的依赖项

fs-more = "0.7.1"

示例

复制文件并获取进度更新

use std::path::Path;

use fs_more::file::CollidingFileBehaviour;
use fs_more::file::FileCopyWithProgressOptions;
use fs_more::file::FileCopyFinished;


let source_path = Path::new("./source-file.txt");
let destination_path = Path::new("./destination-file.txt");

let finished_copy = fs_more::file::copy_file_with_progress(
    source_path,
    destination_path,
    FileCopyWithProgressOptions {
        colliding_file_behaviour: CollidingFileBehaviour::Abort,
        ..Default::default()
    },
    |progress| {
        let percent_copied =
            (progress.bytes_finished as f64) 
            / (progress.bytes_total as f64 * 100.0);

        println!("Copied {:.2}% of the file!", percent_copied);
    }
).unwrap();

match finished_copy {
    FileCopyFinished::Created { bytes_copied } => {
        println!("Copied {bytes_copied} bytes into a fresh file!");
    }
    FileCopyFinished::Overwritten { bytes_copied } => {
        println!("Copied {bytes_copied} bytes over an existing file!");
    }
    // ... (see documentation) ...
    _ => {}
};

移动目录并获取进度更新

use std::path::Path;
use fs_more::directory::DirectoryMoveWithProgressOptions;
use fs_more::directory::DestinationDirectoryRule;


let source_path = Path::new("./source-directory");
let destination_path = Path::new("./destination-directory");

let moved = fs_more::directory::move_directory_with_progress(
    source_path,
    destination_path,
    DirectoryMoveWithProgressOptions {
        destination_directory_rule: DestinationDirectoryRule::AllowEmpty,
        ..Default::default()
    },
    |progress| {
        let percent_moved =
            (progress.bytes_finished as f64) / (progress.bytes_total as f64)
            * 100.0;
        println!(
            "Moved {:.2}% of the directory ({} files and {} directories so far).",
            percent_moved,
            progress.files_moved,
            progress.directories_created
        );
    }
).unwrap();

println!(
    "Moved {} bytes ({} files, {} directories)! Underlying strategy: {:?}.",
    moved.total_bytes_moved,
    moved.files_moved,
    moved.directories_moved,
    moved.strategy_used
);

功能标志

dunce  (默认启用)

启用对 dunce 的可选支持,该支持自动从 Windows 的 UNC 路径中删除可以表示为非 UNC 路径的路径(例如,将 \\?\C:\foo 作为 C:\foo)。这是在内部和外部结果中完成的,例如,在 DirectoryScan 中。

此功能默认启用——并且强烈推荐——因为 Windows 上的路径规范通常返回 UNC 路径。只有在为 Windows 目标编译时,dunce 才有影响。

fs-err  (默认禁用)

启用对 fs-err 的可选支持,该支持为底层 IO 错误提供更有用的错误消息。需要注意的是,fs-more 已经通过自身提供了大量的错误上下文,因此默认禁用。


如何贡献

发现了一个bug,或者只是想通过开发新功能或编写测试来改进 fs-more?太棒了!请先阅读贡献指南:[CONTRIBUTING.md](https://github.com/simongoricar/fs-more/blob/master/CONTRIBUTING.md)。

🧵 可能的未来功能

非常欢迎对以下想法的贡献!

其中一些想法和/或缺失的功能可能比较简单,而另一些则可能不太可能实现。然而,请注意,尽管它们被列在这里,但可能还没有经过深入思考。如果您决定做出贡献,最好首先提出一个问题,以便在开发任何东西之前讨论各种方法。

  • 跨平台:允许复制文件和目录权限。

    这部分功能在有些函数中已经存在,但在API中不统一。原因是 std::fs::copy 已经复制了权限位,但我们没有在几个地方使用它,因为带有进度报告的复制使得使用 std::fs::copy 不可能。理想情况下,我们应该通过现有的 *Options 结构体暴露一个新的选项,并使其一致。

    我认为这应该相对简单,但可能需要考虑一些边缘情况,并实现一些平台特定的功能(例如,在Windows上,我们可能想要复制隐藏文件标志等)。

  • 在Unix上:允许复制文件和目录的所有者和组。

    根据实现复杂性的不同,可能可以使用 file-ownernix?也许我们应该为这些功能启用特性门控,以便普通用户不需要引入这么多依赖项?

  • 跨平台:允许复制文件和目录的创建/访问/修改时间(在整个API中)。这也可以包括各种其他元数据。

    理想情况下,这应该通过现有的 *Options 结构体进行高度可配置。但这可能需要更多的工作,因为各种平台差异(参见:[Unix](https://doc.rust-lang.net.cn/std/os/unix/fs/trait.MetadataExt.html)、[Linux](https://doc.rust-lang.net.cn/std/os/linux/fs/trait.MetadataExt.html)、[Windows](https://doc.rust-lang.net.cn/std/os/windows/fs/trait.MetadataExt.html))。

    这可能更可行的是简单地委托给现有的某个crate,例如 filetime(但这只涵盖时间戳)。也许我们应该从创建/访问/修改时间戳开始,然后再逐步扩展?

  • 在Windows上:允许复制文件和目录的ACL。

    这似乎不太可能实现,在继续之前需要一些具体的用例。也许 windows-acl 能有所帮助?如果这个功能要开发,我认为我们不应该暴露任何底层的ACL API,而应该允许在复制或移动时仅镜像它。这应该绝对是在特性标志下进行的。



许可证

根据以下任一许可证进行许可:

  • Apache许可证,版本2.0([LICENSE-APACHE](https://github.com/simongoricar/fs-more/blob/61a42e97129bd500d84f596113ce9d5b20400197/LICENSE-APACHE) 或 [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0))
  • 麻省理工学院许可证(《LICENSE-MIT》或http://opensource.org/licenses/MIT

根据您自己的选择。

贡献

除非您明确表示,否则根据Apache-2.0许可证定义的您有意提交以包含在作品中的任何贡献,应按上述方式双重许可,不附加任何额外条款或条件。

依赖项

~295–770KB
~18K SLoC