如何检查是不是可以使用 tarfile 模块写入 tar 文件?

Posted

技术标签:

【中文标题】如何检查是不是可以使用 tarfile 模块写入 tar 文件?【英文标题】:How can I check if a tar file can be written to using the tarfile module?如何检查是否可以使用 tarfile 模块写入 tar 文件? 【发布时间】:2016-07-12 18:03:31 【问题描述】:

我希望使用tarfile 附加到 .tar 文件,但我不知道该文件是否正在使用中。如何检查文件是否可以附加到?

我试过了:

try:
   with tarfile.open("foo.tar", "a:") as tar:
      tar.add("bar.txt")
except tarfile.TarError:
   print "error"

这有时会出现错误,但有时不会,并且最后的 tar 文件没有我期望的所有文件。

我的计划是循环使用它并不断尝试直到它起作用。

我还有其他选择,其中大部分涉及将去皮留给另一个流程,但我觉得 tarfile 应该对这类事情负责。我可以为tarfile 编写一个包装器,检查新文件是否出现在tar.getmembers() 列表中。

【问题讨论】:

一般情况下,即使可能正在使用任何文件,您也不应该写入任何文件。虽然附加模式对于简单文件(例如没有任何行超过缓冲区大小的日志)是安全的,但 tarfile 需要覆盖最后几个块。 @o11c 我不确定您所说的“tarfiles 需要覆盖最后几个块”是什么意思。 .tar 文件由 512 字节记录的(不可搜索的)序列组成。档案的结尾由至少两个连续的零填充记录标记。为了追加,您必须消除零记录。 【参考方案1】:

唯一安全的方法是:

制作文件的副本。 以追加模式打开副本。 将副本重命名为原始副本。

【讨论】:

谢谢。是否存在 2 个进程会同时制作副本的问题,添加到不同的副本然后其中一个会在另一个之上重命名? @R.Mckemey 是的,这是可能的。如果您控制所有代码,则可以使用flock。但是,即使在最坏的情况下,您也会自动丢失其中一个更新(类似于断电或崩溃过程),而不是获取损坏的文件。

以上是关于如何检查是不是可以使用 tarfile 模块写入 tar 文件?的主要内容,如果未能解决你的问题,请参考以下文章

为什么tarfile模块不允许压缩追加?

Python tarfile - 检查 tar 中的文件是不是存在于外部(即已被提取)

如何在 Python 3 中从字节缓冲区构造内存中的 TarFile 对象?

Python中使用tarfile压缩解压tar归档文件示例(最新+全面=强烈推荐! ! !)

Python之tarfile模块的使用

python常用标准库(压缩包模块zipfile和tarfile)