【问题标题】: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 字节记录的(不可搜索的)序列组成。档案的结尾由至少两个连续的零填充记录标记。为了追加,您必须消除零记录。

标签: python tar tarfile


【解决方案1】:

唯一安全的方法是:

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

【讨论】:

  • 谢谢。是否存在 2 个进程会同时制作副本的问题,添加到不同的副本然后其中一个会在另一个之上重命名?
  • @R.Mckemey 是的,这是可能的。如果您控制所有代码,则可以使用flock。但是,即使在最坏的情况下,您也会自动丢失其中一个更新(类似于断电或崩溃过程),而不是获取损坏的文件。
猜你喜欢
  • 2015-03-16
  • 2013-04-22
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 2019-10-23
相关资源
最近更新 更多