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