我正在开发一个基于 Perl 的文件同步工具。它将文件下载到一个临时目录(保证与真实文件在同一个文件系统上),然后将临时文件移动到旧文件上,保留权限、所有权和 ACL 等元数据。我想知道如何在 Linux 上实现最后一步。
在 Mac OS X 上,至少在 C 中,我会使用这个exchangedata
函数。这需要两个文件名作为参数并交换它们的内容,使所有元数据(除了 mtime)保持不变。它保证了操作是原子的——所有的读者都可以看到旧文件或新文件,而不会介于两者之间。不幸的是,我认为它在 Linux 上不可用。
我知道它是rename
原子移动的,但它不保留元数据。另一方面,我可以打开文件并用新文件的内容覆盖数据,这将保留所有元数据,但不是原子操作。关于解决这个问题的任何建议?