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:
  • 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.

Se även