如何检查是不是可以使用 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 文件?的主要内容,如果未能解决你的问题,请参考以下文章
Python tarfile - 检查 tar 中的文件是不是存在于外部(即已被提取)
如何在 Python 3 中从字节缓冲区构造内存中的 TarFile 对象?