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.

Siehe auch