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 在 文件系统 中
每月 259 次下载
300KB
4K SLoC
fs-more
基于 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 (默认启用) |
---|
启用对 此功能默认启用——并且强烈推荐——因为 Windows 上的路径规范通常返回 UNC 路径。只有在为 Windows 目标编译时, |
fs-err (默认禁用) |
---|
启用对 |
如何贡献
发现了一个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-owner
或nix
?也许我们应该为这些功能启用特性门控,以便普通用户不需要引入这么多依赖项? -
跨平台:允许复制文件和目录的创建/访问/修改时间(在整个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