Často získáte archiv ZIP, který obsahuje další archivy ZIP, které tvoří vnořenou strukturu archivů. V takových případech možná budete chtít získat plochou strukturu extrahováním všech vnitřních archivů ZIP do vnějšího archivu. Chcete-li tuto operaci provést programově, tento článek ukazuje, jak vytvořit plochý archiv ZIP v C#.

C# .NET API pro vytváření plochých archivů ZIP

K vytvoření plochých archivů ZIP použijeme Aspose.ZIP for .NET. Jedná se o archivační API, které je navrženo pro vytváření a extrahování oblíbených archivních formátů včetně ZIP, TAR, GZip a 7z. Můžete buď nainstalovat API z NuGet nebo stáhnout jeho DLL z části ke stažení.

PM> Install-Package Aspose.Zip

Vytvořte plochý ZIP archiv v C#

Abychom porozuměli struktuře plochého ZIP archivu, uveďme si příklad. Následuje archiv ZIP, který obsahuje další archiv ZIP.

parent.zip
 ├first.txt
 ├inner.zip
 │ ├game.exe
 │ └subitem.bin
 └picture.gif

Po transformaci tohoto ZIP archivu na plochý ZIP budou všechny záznamy vnitřního ZIP extrahovány do nadřazeného ZIP. Nakonec získáme následující strukturu nadřazeného ZIP.

flatten.zip
 ├first.txt
 ├picture.gif
 ├game.exe
 └subitem.bin

Podívejme se, jak tuto transformaci provést programově. Následují kroky k vytvoření plochého ZIP archivu v C#.

  • Nejprve načtěte nadřazený archiv ZIP pomocí třídy Archive.
  • Poté vytvořte seznamy pro uložení vnitřních položek ZIP, které chcete odstranit z nadřazeného ZIP, extrahované položky a jejich názvy.
  • Poté projděte každý ArchiveEntry v nadřazeném ZIP pomocí kolekce Archive.Entries.
  • Pro každou položku proveďte následující operace:
    • Pomocí metody ArchiveEntry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)) zkontrolujte, zda záznam je archiv ZIP.
    • Poté přidejte položku do seznamu položek, které mají být odstraněny.
    • Otevřete záznam do objektu MemoryStream pomocí metody ArchiveEntry.Open().CopyTo(MemoryStream).
    • Iterujte záznamy vnitřního ZIP archivu a v každé iteraci proveďte následující kroky.
      • Přidejte název položky do seznamu položek, které mají být přidány.
      • Poté načtěte záznam do MemoryStream pomocí metody ArchiveEntry.Open().CopyTo(MemoryStream).
      • Nakonec přidejte položku do seznamu položek, které mají být přidány do nadřazeného ZIP.
  • Poté projděte seznam vnitřních archivů ZIP a odstraňte každou položku pomocí metody Archive.DeleteEntry(ArchiveEntry).
  • Projděte seznam položek, které mají být přidány do nadřazeného ZIP, a přidejte každou položku pomocí metody Archive.CreateEntry(String, Stream).
  • Nakonec uložte nadřazený archiv ZIP pomocí metody Archive.Save(String).

Následující ukázka kódu ukazuje, jak vytvořit plochý archiv ZIP v C#.

// Načíst archiv ZIP
using (Archive outer = new Archive("Archives/nested-archive.zip"))
{
    // Vytvořte seznam pro odstranění vnitřních položek ZIP po extrakci
    List<ArchiveEntry> entriesToDelete = new List<ArchiveEntry>();

    // Vytvořte seznam pro přidání názvů souborů ve vnitřních archivech ZIP
    List<string> namesToInsert = new List<string>();

    // Vytvořte seznam pro přidání objektů streamu souborů ve vnitřních archivech ZIP
    List<MemoryStream> contentToInsert = new List<MemoryStream>();

    // Procházejte záznamy v nadřazeném ZIP
    foreach (ArchiveEntry entry in outer.Entries)
    {
        // Zkontrolujte, zda se jedná o soubor ZIP
        if (entry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)) 
        {
            // Přidejte záznam do seznamu, abyste si uchovali odkaz, abyste jej mohli později odstranit z archivu
            entriesToDelete.Add(entry); 

            // Chcete-li otevřít archiv ZIP, vytvořte objekt streamu
            MemoryStream innerCompressed = new MemoryStream();
            entry.Open().CopyTo(innerCompressed);

            // Načtěte archiv ZIP z objektu streamu 
            using (Archive inner = new Archive(innerCompressed))
            {
                // Procházet záznamy archivu
                foreach (ArchiveEntry ie in inner.Entries) 
                {
                    // Ponechte název položky v seznamu
                    namesToInsert.Add(ie.Name); 

                    // Extrahujte záznam archivu do objektu streamu
                    MemoryStream content = new MemoryStream();
                    ie.Open().CopyTo(content);

                    // Přidejte záznam do seznamu
                    contentToInsert.Add(content);
                }
            }
        }
    }

    // Smažte vnitřní archivy ZIP
    foreach (ArchiveEntry e in entriesToDelete)
        outer.DeleteEntry(e);

    // Vložte soubory vnitřních archivů ZIP do nadřazeného archivu ZIP
   for (int i = 0; i < namesToInsert.Count; i++)
        outer.CreateEntry(namesToInsert[i], contentToInsert[i]);

    outer.Save("Archives/flatten.zip");
}

Získejte bezplatnou licenci API

Můžete získat bezplatnou dočasnou licenci k používání Aspose.ZIP pro .NET bez omezení hodnocení.

Závěr

V tomto článku jste se naučili, jak vytvořit plochý ZIP archiv programově v C#. Zejména jsme ukázali, jak vytvořit plochý ZIP extrahováním vnitřních archivů ZIP do nadřazeného ZIP. Kromě toho můžete navštívit dokumentaci a přečíst si více o Aspose.ZIP pro .NET. Své dotazy s námi můžete sdílet také prostřednictvím našeho fóra.

Viz také