2016-07-12 2 views
1

Ich suche an eine .tar-Datei mit tarfile anhängen, aber ich weiß nicht, ob die Datei verwendet wird oder nicht. Wie kann ich überprüfen, ob die Datei angehängt werden kann?Wie kann ich überprüfen, ob eine TAR-Datei mit dem Tarfile-Modul geschrieben werden kann?

Ich habe versucht:

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

und dies wird manchmal den Fehler, aber manchmal ist es nicht und die TAR-Datei am Ende haben nicht alle Dateien, die ich erwarten würde.

Mein Plan ist es, dies in einer Schleife zu haben und weiter zu versuchen, bis es funktioniert.

Ich habe andere Optionen, von denen die meisten die Tarierung zu einem anderen Prozess führen, aber ich denke, dass tarfile für diese Art von Sache verantwortlich sein sollte. Ich könnte einen Wrapper für tarfile schreiben, der die neue Datei auf der tar.getmembers() Liste überprüft.

+0

Im Allgemeinen sollten Sie nicht in eine Datei schreiben, wenn es überhaupt * möglich * ist, dass sie verwendet wird. Während der append-Modus für einfache Dateien wie Logs sicher ist, bei denen keine Zeile über der Puffergröße liegt, müssen Tarfiles die letzten Blöcke überschreiben. – o11c

+0

@ o11c Ich bin mir nicht sicher, was Sie meinen, die "Tarfiles müssen die letzten paar Blöcke überschreiben". –

+0

'.tar' Dateien bestehen aus einer (nicht suchbaren) Folge von 512-Byte-Datensätzen. Das Ende eines Archivs ist durch mindestens zwei aufeinanderfolgende Nullen gekennzeichnet. Um anhängen zu können, müssen Sie die zerotierten Datensätze eliminieren. – o11c

Antwort

2

Die nur sichere Art und Weise, dies zu tun ist:

  • eine Kopie der Datei.
  • Öffnen Sie die Kopie im Append-Modus.
  • Benennen Sie die Kopie über das Original um.
+0

Danke. Gibt es nicht ein Problem, dass 2 Prozesse gleichzeitig eine Kopie erstellen, zu verschiedenen Kopien hinzufügen, dann wird einer von ihnen über den anderen umbenannt? –

+0

@ R.Mckemey Ja, das ist eine Möglichkeit. Wenn Sie den gesamten Code kontrollieren, können Sie 'flock' verwenden. Aber selbst im * schlimmsten Fall verlieren Sie automatisch eines der Updates (ähnlich wie bei einem Stromausfall oder Absturz), anstatt eine beschädigte Datei zu erhalten. – o11c

Verwandte Themen