我使用 Java 的 Files.walkFileTree 定期扫描特定目录中的 *.csv 文件,然后读取它们。
我知道 mv 是原子的(至少在同一设备内),因此“mv”文件在竞争条件方面不应该成为问题。
如果我执行 cp 操作,cp 是否首先复制到不同的文件名,然后对原始名称执行原子 mv 操作?或者直接读写会导致竞争条件吗?
我对使用 tar & gz 将文件提取到另一个目录有同样的问题。
附言。如果答案取决于操作系统,我正在 CentOS 6 上工作。另外,如果可能的话,也可以提及 Windows 的答案吗?
答案1
对于 GNUcp
和 GNU tar
(大多数 Linux 发行版上的标准实现,包括 CentOS),它们都就地创建文件。我很确定大多数其他实现也是如此。不过,编写一个包装脚本以使其在功能上原子化并不太难。我不确定Windows,但我不知道思考它为 POSIX 为文件系统操作原子性提供了更多保证。
还值得注意的是,只有mv
当它不跨越文件系统边界时,它才是原子的,否则它就相当于运行cp
然后取消链接源文件。