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.zipfirst.txtinner.zip
 │ ├game.exe
 │ └subitem.binpicture.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.zipfirst.txtpicture.gifgame.exesubitem.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.

Siehe auch