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文件系统

Download history 47/week @ 2024-03-14 41/week @ 2024-03-21 46/week @ 2024-03-28 39/week @ 2024-04-04 36/week @ 2024-04-11 30/week @ 2024-04-18 35/week @ 2024-04-25 68/week @ 2024-05-02 87/week @ 2024-05-09 47/week @ 2024-05-16 75/week @ 2024-05-23 57/week @ 2024-05-30 32/week @ 2024-06-06 28/week @ 2024-06-13 31/week @ 2024-06-20 157/week @ 2024-06-27

每月253 次下载
2 crates 中使用

MIT/Apache 协议

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 不存在。

希望使用这些功能不需要。如果它们变得必要,那么可能存在一个错误。

许可协议

受以下任一协议的许可:

由您选择。

贡献

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

无运行时依赖

~0–1.2MB
~14K SLoC