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:
- Sprawdź, czy wpis jest archiwum ZIP, używając metody ArchiveEntry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)).
- Następnie dodaj wpis do listy wpisów do usunięcia.
- Otwórz wpis w obiekcie MemoryStream za pomocą metody ArchiveEntry.Open().CopyTo(MemoryStream).
- Przejrzyj wpisy wewnętrznego archiwum ZIP i w każdej iteracji wykonaj następujące kroki.
- Dodaj nazwę wpisu do listy wpisów do dodania.
- Następnie załaduj wpis do MemoryStream za pomocą metody ArchiveEntry.Open().CopyTo(MemoryStream).
- Na koniec dodaj wpis do listy wpisów, które mają zostać dodane do nadrzędnego ZIP.
- 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.