7-Zip viele Dateien aus verschiedenen Ordnern?

4626
mafu

Ich möchte eine große Anzahl von Dateien mit unterschiedlichen Namen aus verschiedenen Ordnern zu einem einzigen 7-Zip-Archiv hinzufügen 7za.exe. Dies sollte einfach sein, stellte sich jedoch als großer Schmerz heraus.

Ich habe eine Datei erstellt, die die Pfade ( 7za a out.7z @list.txt) enthält. Sobald jedoch zu viele (~ 100) Dateien vorhanden sind, schlägt diese fehl. Anscheinend wird der Inhalt der Argumentdatei in den Befehlszeilenpuffer [ Bearbeiten : Dies ist wahrscheinlich eine Fehlinformation meinerseits, oder war es nicht der Grund ], was viel zu klein ist (die Anzahl der hinzuzufügenden Dateien ist mehr als eine Million).

Eine Aufteilung des Prozesses durch Hinzufügen der Dateien nacheinander ist aufgrund der Funktionsweise nicht möglich 7za: Beim Hinzufügen der nächsten Datei wird eine Kopie des Archivs erstellt, die Datei wird der Kopie hinzugefügt und das Original wird schließlich ersetzt. Dies ist enorm langsam, wenn das Archiv einige 100 MB groß ist.

Bisher verwende ich eine Kombination der beiden Ansätze, indem ich jedes Mal ein Dutzend Dateien in einer Schleife hinzufüge, aber es ist ein unzuverlässiger Hack und immer noch sehr langsam. Gibt es einen besseren Weg, dies zu tun?

Ich habe versucht, 7-Zip-Wrapper-DLLs zu verwenden (ich bin ein C # -Programmierer), aber keiner von ihnen funktionierte zuverlässig und mir wurde wiederholt die Verwendung 7zastattdessen empfohlen .

4
'-a werden in den Befehlszeilenpuffer geschoben' .. ich neige nicht dazu, dass diese Behauptung falsch ist. zumal der Code die Funktion `ReadNamesFromListFile ()` aus der Datei `ListFileUtils.cpp` verwendet. Das '-a' Flag existiert überhaupt nicht, die Kommandozeile sollte eher wie `7za a out.7z @ in.txt` aussehen akira vor 11 Jahren 0
Ich habe 50 Ordner mit jeweils 100 (leeren) Textdateien erstellt. Erstellen Sie eine Liste der Dateien. fütterte diese Liste in '7za'. Lief wie am Schnürchen. Weitere Informationen dazu, wie Sie die Liste der Dateien erstellen, wie die Dateien organisiert sind (pfadmäßig), wo sich Ihr Arbeitsverzeichnis befindet usw. akira vor 11 Jahren 0
Können Sie einen Befehl ausführen, um alle diese Dateien in einen neuen Ordner zu kopieren, diesen dann zu komprimieren oder müssen Sie die Dateistruktur beibehalten? SaintWacko vor 11 Jahren 0
@akira: Ja, mein Fehler, ich habe den Fragentext aktualisiert. mafu vor 11 Jahren 0
@akira: Könntest du das mit einer noch größeren Anzahl von Dateien und längeren Pfaden versuchen? Der Befehl, den ich verwende, ist "7za / 7za.exe", ein "C: \ foo / 0000.7z" -mx1 -w "C: \ foo /" - "C: \ temp \ list.tmp" `. Das Arbeitsverzeichnis ist c: \ input und alle Pfade in list.tmp befinden sich in diesem Verzeichnis. (Die echten Verzeichnisnamen sind länger und tiefer.) mafu vor 11 Jahren 0
@ SaintWacko: Gute Idee. Die Verzeichnisstruktur muss beibehalten werden, aber da ich den Kopf des Pfads trotzdem abgeschnitten habe, kann ich auch das Ende der Verzeichnisstruktur neu erstellen und die Dateien kopieren. Dann füge ich das gesamte Verzeichnis in 7za ein. Der Nachteil wäre, dass es sich um einen zusätzlichen Kopierschritt von Millionen von Dateien handelt, aber ich denke, ich kann damit leben. Weitaus besser, als die arch-Datei tausendfach kopieren zu müssen. mafu vor 11 Jahren 0
@mafutrct: wie lang, wie tief? Was sind deine längsten Pfadnamen? Je nachdem, wie 7za geschrieben wurde und welche API es verwendet, liegt möglicherweise ein Problem mit "zu langen" Pfadnamen vor. akira vor 11 Jahren 0
@akira: Ich bin mir nicht sicher, ich werde das überprüfen. Ich weiß jedoch genau, dass alles funktioniert, wenn ich 7za wiederholt kleinere Listen zufüge. Bei großen Listen verschluckt es immer zur gleichen Zeit (dh, wenn es erneut mit derselben Liste ausgeführt wird, stoppt es an derselben Datei, obwohl der Dateipfad in keiner Weise ungewöhnlich ist). mafu vor 11 Jahren 0
@akira: Arbeitsverzeichnis und Exe-Pfadlänge ist 92, der längste Pfad in der Listendatei ist 168, von denen 29 der Stammordner des Archivs sind. Der Zielpfad für die ZIP-Datei lautet 56. Der gesamte Befehl für eine einzelne Datei hätte die Länge 693 (und funktioniert für mich). mafu vor 11 Jahren 0
@mafutrct - Löst das dein Problem? Soll ich es als Antwort ablegen? SaintWacko vor 11 Jahren 0
@mafutrct: 7za verwendet das Unicode-API für win32, sodass bis zu ~ 32.000 Zeichen im Pfad verarbeitet werden können. stürzt 7za nach dem n-ten Eintrag in der Liste ab? einfach normal abschließen? Was ist der Exit-Code? Was sagt Ihnen ein Debugger (Windbg)? ist es immer derselbe Eintrag in der Liste, der 7za stoppt? warum willst du uns 7za? nur für die Kompression? akira vor 11 Jahren 0
@ SaintWacko: Ja, bitte, es ist ein praktikabler Workaround. mafu vor 11 Jahren 0
@akira: Ich werde in Kürze mit weiteren Informationen zurückkommen. Ja, es ist immer derselbe Eintrag. Ich verwende es sowohl zum Komprimieren als auch zum Sammeln mehrerer Dateien in einer Datei. mafu vor 11 Jahren 0

1 Antwort auf die Frage

4
mafu

Aufgrund der dummen Art, wie ich an das Problem herangehe, brauchte ich viel Zeit, um den wahren Grund herauszufinden. Es liegt an einem Fehler in 7zip an einem Ort, an den ich nicht gedacht habe.

Bei Verwendung einer Listendatei in CLI-Version 4.57 wird eine falsche Fehlermeldung angezeigt. Wenn eine Listendatei einige Zeilen absoluter Pfade enthält (scheinbar funktionieren relative Pfade), die auf gleichnamige Dateien in verschiedenen Verzeichnissen verweisen, wird der Fehler "Duplicate Dateiname" angezeigt.

Ich konnte das Problem mit zwei beliebigen Dateien gleichen Namens in verschiedenen Verzeichnissen mit ihrem absoluten Pfad in der Listendatei reproduzieren.

In der ursprünglichen Frage funktionierte das Hinzufügen von nur einer oder wenigen Dateien gleichzeitig (die Archivdatei selbst wurde problemlos erstellt), da die Listendatei (versehentlich) keine solchen "doppelten Dateinamen" enthielt.

Offiziell wird es eine Funktion genannt. Während ich unsicher bin, verwirrte es mich und andere zweifellos, weil es undokumentiert war.

also das Deduplizieren der Liste löst das Problem tatsächlich? akira vor 11 Jahren 0
Oh, das würde eigentlich Sinn machen. 7zip speichert den Dateipfad nicht so, wie Sie es denken würden. Es speichert nur die Dateien, und anderswo verfolgt es den Pfad für jede Datei. Das bedeutet, wenn Sie zwei Dateien mit demselben Namen haben, selbst wenn sie unterschiedliche Pfade haben, wird es immer noch als Versuch erscheinen, zwei identische Dateien in das Archiv zu legen. SaintWacko vor 11 Jahren 0
@akira: Ja, das stimmt - die "doppelten" Dateien müssen einzeln hinzugefügt werden. mafu vor 11 Jahren 0
@SaintWacko: Zur Klarstellung speichert 7z im vorliegenden Fall den Pfad der Datei im Archiv. Deshalb ist es möglich, Dateien mit demselben Namen einzeln hinzuzufügen. In der Listendatei werden jedoch nur Namen und keine Pfade geprüft, und dies schlägt fehl. mafu vor 11 Jahren 0
@mafutrct - Oh wirklich? Mein schlechtes, ich muss etwas falsch verstanden haben. Danke, dass du mich geklärt hast :) SaintWacko vor 11 Jahren 0