【发布时间】:2009-11-07 18:06:26
【问题描述】:
我正在开发基于 Perl 的文件同步工具。它将文件下载到一个临时目录(保证与真实文件在同一个文件系统上),然后将临时文件移动到旧文件上,保留权限、所有权和 ACL 等元数据。我想知道如何在 Linux 上实现最后一步。
在 Mac OS X 上,至少在 C 中,我会使用 exchangedata 函数。这需要两个文件名作为参数并交换它们的内容,使所有元数据(除了 mtime)保持不变。它保证了操作是原子的——所有的读者都可以看到旧文件或新文件,而不会介于两者之间。不幸的是,我认为它在 Linux 上不可用。
我知道rename 自动移动,但它不保留元数据。另一方面,我可以打开文件并用新文件的内容覆盖数据,这将保留所有元数据,但不是原子操作。有什么解决这个问题的建议吗?
【问题讨论】:
-
您正在努力保存什么样的元数据? Unix 中只有所有者/组和所有者/组/每个人的权限。这是否会发生如此大的变化以至于对您来说是个问题?
-
许多 Linux 文件系统也支持扩展属性和 ACL,非特权用户可能没有必要的权限将临时文件的用户和组更改为旧的。基本上,这里涉及很多微妙之处,我想知道是否已经存在处理它的东西。
标签: linux perl macos file atomic