假设我有一个 python 脚本,它每秒file_i.yo
在文件夹中生成一些文件。folder
一段时间后,我决定必须压缩当前状态folder
并将其发送到某个地方。因此我调用 bash
zip -r current_folder.zip folder
压缩大约需要 1 分钟。
在这种情况下会发生什么?我最感兴趣的是压缩文件是否有可能被破坏。
答案1
存档本身不会有问题(即,它将是一个有效的 zip 存档),但file_i.yo
内部可能会损坏,也可能不会损坏。这取决于如何file_i.yo
更新。比较这个答案:
当您想要修改文件时,您有两种选择,每种选择都有其优点和缺点。
- 您可以就地覆盖该文件。这不使用任何额外的空间,并保留硬链接、权限和现有文件内容之外的任何其他属性。这样做的主要缺点是,如果在写入文件时发生任何事情(应用程序崩溃或断电),您最终会得到部分写入的文件。
- 您可以将文件的新版本写入具有不同名称的新文件,然后将其移动到位。这会使用更多空间并破坏硬链接,如果您对某个文件有写权限,但对它包含的目录没有写权限,则根本无法执行此操作。另一方面,文件的旧版本会自动被新版本替换,因此在每个时间点,文件名都指向文件的有效、完整版本。
zip
在第一种情况下,当您的进程读取文件时,文件可能会发生更改。实际上,读取的内容将类似于以下内容的二进制等价物全景失败:结果的不同片段将来自现实的不同“版本”。如果发生这种情况,则生成的存档将包含损坏的、空的或部分file_i.yo
文件(取决于文件如何就地更新以及在更新过程的哪个阶段设法zip
读取文件)。
在第二种情况下,zip
将打开文件并读取一些单个“版本”。即使新文件(新“版本”)替换了目录中的旧文件,所使用的描述符zip
也将指向旧文件,并且该工具会将其读到底。生成的存档将包含一些有效的file_i.yo
文件。