Często otrzymujesz archiwum ZIP, które zawiera inne archiwa ZIP, tworząc zagnieżdżoną strukturę archiwów. W takich przypadkach możesz chcieć uzyskać płaską strukturę, wyodrębniając wszystkie wewnętrzne archiwa ZIP do archiwum zewnętrznego. Aby programowo wykonać tę operację, w tym artykule pokazano, jak utworzyć płaskie archiwum ZIP w języku C#.

C# .NET API do tworzenia płaskich archiwów ZIP

Aby utworzyć płaskie archiwa ZIP, użyjemy Aspose.ZIP for .NET. Jest to interfejs API do archiwizacji przeznaczony do tworzenia i wyodrębniania popularnych formatów archiwów, w tym ZIP, TAR, GZip i 7z. Możesz zainstalować interfejs API z NuGet lub pobrać jego bibliotekę DLL z sekcji pobierania.

PM> Install-Package Aspose.Zip

Utwórz płaskie archiwum ZIP w C#

Aby zrozumieć strukturę płaskiego archiwum ZIP, weźmy przykład. Poniżej znajduje się archiwum ZIP, które zawiera inne archiwum ZIP.

parent.zipfirst.txtinner.zip
 │ ├game.exe
 │ └subitem.binpicture.gif

Po przekształceniu tego archiwum ZIP w płaski plik ZIP wszystkie wpisy z wewnętrznego pliku ZIP zostaną wyodrębnione do nadrzędnego pliku ZIP. Na koniec otrzymamy następującą strukturę nadrzędnego pliku ZIP.

flatten.zipfirst.txtpicture.gifgame.exesubitem.bin

Zobaczmy, jak wykonać tę transformację programowo. Poniżej przedstawiono kroki tworzenia płaskiego archiwum ZIP w języku C#.

  • Najpierw załaduj nadrzędne archiwum ZIP, używając klasy Archive.
  • Następnie utwórz listy do przechowywania wewnętrznych wpisów ZIP do usunięcia z nadrzędnego ZIP, wyodrębnionych wpisów i ich nazw.
  • Następnie przejrzyj każdy ArchiveEntry w nadrzędnym pliku ZIP, używając kolekcji Archive.Entries.
  • Dla każdego wpisu wykonaj następujące operacje:
  • Następnie przejrzyj listę wewnętrznych archiwów ZIP i usuń każdy wpis za pomocą metody Archive.DeleteEntry(ArchiveEntry).
  • Przejrzyj listę wpisów, które mają zostać dodane do nadrzędnego pliku ZIP i dodaj każdy wpis za pomocą metody Archive.CreateEntry(String, Stream).
  • Na koniec zapisz nadrzędne archiwum ZIP przy użyciu metody Archive.Save(String).

Poniższy przykładowy kod pokazuje, jak utworzyć płaskie archiwum ZIP w języku C#.

// Załaduj archiwum ZIP
using (Archive outer = new Archive("Archives/nested-archive.zip"))
{
    // Utwórz listę, aby usunąć wewnętrzne wpisy ZIP po wyodrębnieniu
    List<ArchiveEntry> entriesToDelete = new List<ArchiveEntry>();

    // Utwórz listę, aby dodać nazwy plików w wewnętrznych archiwach ZIP
    List<string> namesToInsert = new List<string>();

    // Utwórz listę, aby dodać obiekty strumieniowe plików w wewnętrznych archiwach ZIP
    List<MemoryStream> contentToInsert = new List<MemoryStream>();

    // Zapętlaj wpisy w nadrzędnym pliku ZIP
    foreach (ArchiveEntry entry in outer.Entries)
    {
        // Sprawdź, czy wpis jest plikiem ZIP
        if (entry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)) 
        {
            // Dodaj wpis do listy, aby zachować odniesienie w celu późniejszego usunięcia go z archiwum
            entriesToDelete.Add(entry); 

            // Utwórz obiekt strumienia, aby otworzyć archiwum ZIP
            MemoryStream innerCompressed = new MemoryStream();
            entry.Open().CopyTo(innerCompressed);

            // Załaduj archiwum ZIP z obiektu strumienia 
            using (Archive inner = new Archive(innerCompressed))
            {
                // Zapętlaj wpisy archiwum
                foreach (ArchiveEntry ie in inner.Entries) 
                {
                    // Zachowaj nazwę wpisu na liście
                    namesToInsert.Add(ie.Name); 

                    // Wyodrębnij wpis archiwum do obiektu strumienia
                    MemoryStream content = new MemoryStream();
                    ie.Open().CopyTo(content);

                    // Dodaj wpis do listy
                    contentToInsert.Add(content);
                }
            }
        }
    }

    // Usuń wewnętrzne archiwa ZIP
    foreach (ArchiveEntry e in entriesToDelete)
        outer.DeleteEntry(e);

    // Wstaw pliki wewnętrznych archiwów ZIP do nadrzędnego archiwum ZIP
   for (int i = 0; i < namesToInsert.Count; i++)
        outer.CreateEntry(namesToInsert[i], contentToInsert[i]);

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

Uzyskaj bezpłatną licencję API

Możesz otrzymać darmową tymczasową licencję na używanie Aspose.ZIP for .NET bez ograniczeń ewaluacyjnych.

Wniosek

W tym artykule nauczyłeś się programowo tworzyć płaskie archiwum ZIP w języku C#. W szczególności pokazaliśmy, jak zrobić płaski plik ZIP, rozpakowując wewnętrzne archiwa ZIP do nadrzędnego pliku ZIP. Oprócz tego możesz odwiedzić dokumentację, aby przeczytać więcej o Aspose.ZIP for .NET. Możesz również podzielić się z nami swoimi pytaniami za pośrednictwem naszego forum.

Zobacz też