Oft erhalten Sie ein ZIP-Archiv, das andere ZIP-Archive enthält, die eine verschachtelte Struktur der Archive bilden. In solchen Fällen möchten Sie möglicherweise eine flache Struktur erhalten, indem Sie alle inneren ZIP-Archive in das äußere Archiv extrahieren. Um diesen Vorgang programmgesteuert auszuführen, zeigt dieser Artikel, wie Sie ein flaches ZIP-Archiv in C# erstellen.
C# .NET-API zum Erstellen von flachen ZIP-Archiven
Um die flachen ZIP-Archive zu erstellen, verwenden wir Aspose.ZIP for .NET. Es ist eine Archivierungs-API, die zum Erstellen und Extrahieren gängiger Archivformate wie ZIP, TAR, GZip und 7z entwickelt wurde. Sie können die API entweder von NuGet installieren oder ihre DLL aus dem Download-Bereich herunterladen.
PM> Install-Package Aspose.Zip
Erstellen Sie ein flaches ZIP-Archiv in C#
Um die Struktur eines flachen ZIP-Archivs zu verstehen, nehmen wir ein Beispiel. Das Folgende ist ein ZIP-Archiv, das ein weiteres ZIP-Archiv enthält.
parent.zip
├first.txt
├inner.zip
│ ├game.exe
│ └subitem.bin
└picture.gif
Nach der Umwandlung dieses ZIP-Archivs in ein flaches ZIP werden alle Einträge des inneren ZIP in das übergeordnete ZIP extrahiert. Schließlich erhalten wir die folgende Struktur der übergeordneten ZIP.
flatten.zip
├first.txt
├picture.gif
├game.exe
└subitem.bin
Sehen wir uns an, wie diese Transformation programmgesteuert durchgeführt wird. Im Folgenden sind die Schritte zum Erstellen eines flachen ZIP-Archivs in C# aufgeführt.
- Laden Sie zuerst das übergeordnete ZIP-Archiv mit der Klasse Archive.
- Erstellen Sie dann Listen zum Speichern der inneren ZIP-Einträge, die aus der übergeordneten ZIP gelöscht werden sollen, extrahierte Einträge und ihre Namen.
- Durchlaufen Sie danach jeden ArchiveEntry in der übergeordneten ZIP-Datei mit der Sammlung Archive.Entries.
- Führen Sie für jeden Eintrag die folgenden Vorgänge aus:
- Überprüfen Sie, ob der Eintrag ein ZIP-Archiv ist, indem Sie die Methode ArchiveEntry.Name.EndsWith(.zip", StringComparison.InvariantCultureIgnoreCase)) verwenden.
- Fügen Sie dann einen Eintrag zur Liste der zu löschenden Einträge hinzu.
- Öffnen Sie den Eintrag in ein MemoryStream-Objekt mit der Methode ArchiveEntry.Open().CopyTo(MemoryStream).
- Durchlaufen Sie die Einträge des inneren ZIP-Archivs und führen Sie bei jeder Iteration die folgenden Schritte aus.
- Fügen Sie den Namen des Eintrags in die Liste der hinzuzufügenden Einträge ein.
- Laden Sie dann den Eintrag mit der ArchiveEntry.Open().CopyTo(MemoryStream)-Methode in MemoryStream.
- Fügen Sie abschließend einen Eintrag zur Liste der Einträge hinzu, die der übergeordneten ZIP hinzugefügt werden sollen.
- Durchlaufen Sie dann die Liste der inneren ZIP-Archive und löschen Sie jeden Eintrag mit der Methode Archive.DeleteEntry(ArchiveEntry).
- Durchlaufen Sie die Liste der Einträge, die der übergeordneten ZIP hinzugefügt werden sollen, und fügen Sie jeden Eintrag mit der Methode Archive.CreateEntry(String, Stream) hinzu.
- Speichern Sie abschließend das übergeordnete ZIP-Archiv mit der Methode Archive.Save(String).
Das folgende Codebeispiel zeigt, wie Sie ein flaches ZIP-Archiv in C# erstellen.
// ZIP-Archiv laden
using (Archive outer = new Archive("Archives/nested-archive.zip"))
{
// Erstellen Sie eine Liste, um innere ZIP-Einträge nach der Extraktion zu löschen
List<ArchiveEntry> entriesToDelete = new List<ArchiveEntry>();
// Erstellen Sie eine Liste, um Namen von Dateien in inneren ZIP-Archiven hinzuzufügen
List<string> namesToInsert = new List<string>();
// Erstellen Sie eine Liste, um Stream-Objekte von Dateien in inneren ZIP-Archiven hinzuzufügen
List<MemoryStream> contentToInsert = new List<MemoryStream>();
// Durchlaufen Sie Einträge in der übergeordneten ZIP
foreach (ArchiveEntry entry in outer.Entries)
{
// Überprüfen Sie, ob der Eintrag eine ZIP-Datei ist
if (entry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase))
{
// Eintrag zur Liste hinzufügen, um Referenz zu behalten, um ihn später aus dem Archiv zu entfernen
entriesToDelete.Add(entry);
// Stream-Objekt erstellen, um das ZIP-Archiv zu öffnen
MemoryStream innerCompressed = new MemoryStream();
entry.Open().CopyTo(innerCompressed);
// Laden Sie das ZIP-Archiv aus dem Stream-Objekt
using (Archive inner = new Archive(innerCompressed))
{
// Archiveinträge durchlaufen
foreach (ArchiveEntry ie in inner.Entries)
{
// Behalten Sie den Namen des Eintrags in der Liste bei
namesToInsert.Add(ie.Name);
// Archiveintrag in ein Stream-Objekt extrahieren
MemoryStream content = new MemoryStream();
ie.Open().CopyTo(content);
// Eintrag zur Liste hinzufügen
contentToInsert.Add(content);
}
}
}
}
// Löschen Sie die inneren ZIP-Archive
foreach (ArchiveEntry e in entriesToDelete)
outer.DeleteEntry(e);
// Fügen Sie die Dateien der inneren ZIP-Archive in das übergeordnete ZIP-Archiv ein
for (int i = 0; i < namesToInsert.Count; i++)
outer.CreateEntry(namesToInsert[i], contentToInsert[i]);
outer.Save("Archives/flatten.zip");
}
Holen Sie sich eine kostenlose API-Lizenz
Sie können eine kostenlose temporäre Lizenz erwerben, um Aspose.ZIP für .NET ohne Evaluierungseinschränkungen zu verwenden.
Fazit
In diesem Artikel haben Sie gelernt, wie Sie ein flaches ZIP-Archiv programmgesteuert in C# erstellen. Insbesondere haben wir gezeigt, wie man eine flache ZIP-Datei erstellt, indem man die inneren ZIP-Archive in die übergeordnete ZIP-Datei extrahiert. Abgesehen davon können Sie die Dokumentation besuchen, um mehr über Aspose.ZIP für .NET zu erfahren. Außerdem können Sie uns Ihre Fragen über unser Forum mitteilen.