Č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.