2016-07-12 83 views
1

我正在尋找使用tarfile追加到.tar文件,但我不知道該文件是否在使用中。如何檢查文件是否可以附加到?如何檢查是否可以使用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()列表中是否出現新文件。

+0

一般來說,如果它甚至可能*在使用中,則不應該寫入任何文件。儘管append-mode對於像日誌那樣的簡單文件是安全的,其中沒有行高於緩衝區大小,tarfiles需要覆蓋最後幾個塊。 – o11c

+0

@ o11c我不確定你的意思是「tarfiles需要覆蓋最後幾個塊」。 –

+0

'.tar'文件由512字節記錄的(不可搜索的)序列組成。檔案的結尾至少有兩個連續的零填充記錄。爲了追加,您必須消除歸零記錄。 – o11c

回答

2

唯一安全的方式做到這一點是:

  • 使文件的副本。
  • 以追加模式打開副本
  • 將副本重命名爲原件。
+0

謝謝。是不是有一個問題,2個進程會同時創建一個副本,添加到不同的副本,然後其中一個會重新命名爲另一個副本? –

+0

@ R.Mckemey是的,這是一種可能性。如果你控制所有的代碼,你可以使用'flock'。但是,即使在最糟糕的情況下,您也會自動丟失其中一個更新(類似於斷電或崩潰過程),而不是獲取損壞的文件。 – o11c

相關問題