
Ofta får du ett ZIP-arkiv som innehåller andra ZIP-arkiv inuti det som bildar en kapslad struktur av arkiven. I sådana fall kanske du vill få en platt struktur genom att extrahera alla inre ZIP-arkiv i det yttre arkivet. För att utföra denna operation programmatiskt visar den här artikeln hur man skapar ett platt ZIP-arkiv i C#.
C# .NET API för att skapa platta ZIP-arkiv
För att skapa de platta ZIP-arkiven kommer vi att använda Aspose.ZIP för .NET. Det är ett arkiverings-API som är utformat för att skapa och extrahera populära arkivformat inklusive ZIP, TAR, GZip och 7z. Du kan antingen installera API:t från NuGet eller ladda ner dess DLL från nedladdningssektionen.
PM> Install-Package Aspose.Zip
Skapa ett platt ZIP-arkiv i C#
För att förstå strukturen för ett platt ZIP-arkiv, låt oss ta ett exempel. Följande är ett ZIP-arkiv som innehåller ett annat ZIP-arkiv inuti det.
parent.zip
├first.txt
├inner.zip
│ ├game.exe
│ └subitem.bin
└picture.gif
Efter att ha omvandlat detta ZIP-arkiv till ett platt ZIP kommer alla poster i det inre ZIP att extraheras till det överordnade ZIP. Slutligen får vi följande struktur för den överordnade ZIP.
flatten.zip
├first.txt
├picture.gif
├game.exe
└subitem.bin
Låt oss se hur man utför denna transformation programmatiskt. Följande är stegen för att skapa ett platt ZIP-arkiv i C#.
- Ladda först det överordnade ZIP-arkivet med klassen Archive.
- Skapa sedan listor för att lagra de inre ZIP-posterna för att radera från överordnade ZIP, extraherade poster och deras namn.
- Efter det går du igenom varje ArchiveEntry i det överordnade ZIP-numret med hjälp av Archive.Entries-samlingen.
- Utför följande åtgärder för varje post:
- Kontrollera om posten är ett ZIP-arkiv med metoden ArchiveEntry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)).
- Lägg sedan till post i listan över poster som ska raderas.
- Öppna inträde i ett MemoryStream-objekt med metoden ArchiveEntry.Open().CopyTo(MemoryStream).
- Iterera genom posterna i det inre ZIP-arkivet och utför följande steg i varje iteration.
- Lägg till namnet på posten i listan över poster som ska läggas till.
- Ladda sedan in posten till MemoryStream med metoden ArchiveEntry.Open().CopyTo(MemoryStream).
- Slutligen, lägg till post i listan över poster som ska läggas till förälder ZIP.
- Gå sedan igenom listan med inre ZIP-arkiv och radera varje post med metoden Archive.DeleteEntry(ArchiveEntry).
- Bläddra igenom listan över poster som ska läggas till i överordnad ZIP och lägg till varje post med metoden Archive.CreateEntry(String, Stream).
- Slutligen, spara det överordnade ZIP-arkivet med metoden Archive.Save(String).
Följande kodexempel visar hur man skapar ett platt ZIP-arkiv i C#.
// Ladda ZIP-arkiv
using (Archive outer = new Archive("Archives/nested-archive.zip"))
{
// Skapa en lista för att ta bort inre ZIP-poster efter extraktion
List<ArchiveEntry> entriesToDelete = new List<ArchiveEntry>();
// Skapa en lista för att lägga till namn på filer i inre ZIP-arkiv
List<string> namesToInsert = new List<string>();
// Skapa en lista för att lägga till strömobjekt av filer i inre ZIP-arkiv
List<MemoryStream> contentToInsert = new List<MemoryStream>();
// Gå igenom poster i det överordnade ZIP-numret
foreach (ArchiveEntry entry in outer.Entries)
{
// Kontrollera om posten är en ZIP-fil
if (entry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase))
{
// Lägg till post i listan för att behålla referensen för att ta bort den från arkivet senare
entriesToDelete.Add(entry);
// Skapa strömobjekt för att öppna ZIP-arkivet
MemoryStream innerCompressed = new MemoryStream();
entry.Open().CopyTo(innerCompressed);
// Ladda ZIP-arkivet från strömobjektet
using (Archive inner = new Archive(innerCompressed))
{
// Slinga över poster i arkivet
foreach (ArchiveEntry ie in inner.Entries)
{
// Behåll namnet på posten i listan
namesToInsert.Add(ie.Name);
// Extrahera arkivpost i ett strömobjekt
MemoryStream content = new MemoryStream();
ie.Open().CopyTo(content);
// Lägg till post i listan
contentToInsert.Add(content);
}
}
}
}
// Ta bort de inre ZIP-arkiven
foreach (ArchiveEntry e in entriesToDelete)
outer.DeleteEntry(e);
// Infoga filerna i det inre ZIP-arkivet i det överordnade ZIP-arkivet
for (int i = 0; i < namesToInsert.Count; i++)
outer.CreateEntry(namesToInsert[i], contentToInsert[i]);
outer.Save("Archives/flatten.zip");
}
Skaffa en gratis API-licens
Du kan få en gratis tillfällig licens för att använda Aspose.ZIP för .NET utan utvärderingsbegränsningar.
Slutsats
I den här artikeln har du lärt dig hur du skapar ett platt ZIP-arkiv programmatiskt i C#. Speciellt har vi visat hur man gör en platt ZIP genom att extrahera de inre ZIP-arkiven till den överordnade ZIP. Bortsett från det kan du besöka dokumentationen för att läsa mer om Aspose.ZIP för .NET. Du kan också dela dina frågor med oss via vårt forum.