使用 fs::rename 在不同文件系统之间移动文件是原子的吗?

Is using fs::rename to move files between different file systems atomic?

在 Linux,如果我们将文件从一个文件系统移动(重命名)到另一个文件系统,如下所示:

fs::rename("/src/a", "/dest/a")?;

文件 /dest/a 是否有可能成为 visible/available 其他潜在读者(例如扫描 /dest/ 的进程)整个文件数据(内容)是否已完全复制到目标文件系统?

来自the docs

This will not work if the new name is on a different mount point.

所以你不应该使用 fs::rename 在挂载点之间移动。这是一个简单的文件系统重命名,实际上并没有 移动 任何数据(这就是为什么你可以相当快地 fs::rename 一个 2 TB 的文件),所以它只有在源和目的地在同一个文件系统上。

如果源和目标在同一个挂载点上,那么答案是否定的。在它完全可用之前,不可能有人阅读它,因为,再一次,实际上没有传输任何数据:它只是“这个指针现在指向这里,这个指针不再存在”的单一操作。