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.zip
 ├first.txt
 ├inner.zip
 │ ├game.exe
 │ └subitem.bin
 └picture.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.zip
 ├first.txt
 ├picture.gif
 ├game.exe
 └subitem.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ż