5 个不稳定版本
0.3.2 | 2023年7月17日 |
---|---|
0.3.1 | 2023年2月25日 |
0.3.0 | 2022年12月9日 |
0.2.0 | 2022年12月7日 |
0.1.0 | 2022年12月6日 |
#423 在 文件系统
每月253 次下载
在 2 crates 中使用
28KB
463 行
Renamore
更多重命名文件的方法。
概述
Rust 标准库提供了用于重命名文件的 std::fs::rename
函数。有时,这还不够。考虑一下重命名一个文件,但如果目标路径已存在东西,则中止操作的情况。这可以通过 Rust 标准库实现,但确保操作是原子的需要平台特定的 API。如果不使用平台特定的 API,可能会引入 TOCTTOU 缺陷。这个库旨在提供对这些 API 的跨平台接口。
示例
可以使用 rename_exclusive
来重命名一个文件,而不可能意外覆盖任何内容。需要注意的是,此功能并非所有操作系统和文件系统组合都支持。rename_exclusive
将在无法原子操作时失败。
use std::io::Result;
fn main() -> Result<()> {
renamore::rename_exclusive("old.txt", "new.txt")
}
或者,可以使用 rename_exclusive_fallback
。这将尝试原子地执行操作,如果不支持则使用非原子回退。返回值将指示发生了什么。
use std::io::Result;
fn main() -> Result<()> {
if renamore::rename_exclusive_fallback("old.txt", "new.txt")? {
// `new.txt` was definitely not overwritten.
println!("The operation was atomic");
} else {
// `new.txt` was probably not overwritten.
println!("The operation was not atomic");
}
Ok(())
}
平台特定行为
在 Linux 上,使用 renameat2
系统调用。glibc 自 2.28 版本以来提供此系统调用的包装器,但 musl(尚未提供)。在构建时检查包装器的存在,如果找不到,则提供包装器。如果出现问题,可以使用两个功能来绕过此机制。
always-supported
。假设renameat2
存在。always-fallback
。假设renameat2
不存在。
希望使用这些功能不需要。如果它们变得必要,那么可能存在一个错误。
许可协议
受以下任一协议的许可:
- Apache许可证版本2.0(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确表示 otherwise,否则根据Apache-2.0许可证定义的,任何您有意提交以包含在作品中的贡献,将如上双重许可,不附加任何额外条款或条件。
无运行时依赖
~0–1.2MB
~14K SLoC