Szukaj…


Wprowadzenie

Klasa ZipFile mieszka w przestrzeni nazw System.IO.Compression . Można go używać do odczytu i zapisu do plików Zip.

Uwagi

  • Możesz także użyć MemoryStream zamiast FileStream.

  • Wyjątki

Wyjątek Stan
ArgumentException Strumień został już zamknięty lub możliwości strumienia nie odpowiadają trybowi (np .: próba zapisu do strumienia tylko do odczytu)
ArgumentNullException strumień wejściowy ma wartość NULL
ArgumentOutOfRangeException tryb ma niepoprawną wartość
InvalidDataException Zobacz listę poniżej

Zgłoszenie wyjątku InvalidDataException może mieć 3 przyczyny:

  • Zawartość strumienia nie mogła być interpretowana jako archiwum zip
  • Tryb to Aktualizuj, aw archiwum brakuje wpisu lub jest on uszkodzony i nie można go odczytać
  • Tryb to Aktualizacja, a wpis jest zbyt duży, aby zmieścił się w pamięci

Wszystkie informacje zostały zaczerpnięte z tej strony MSDN

Wyświetlanie zawartości ZIP

Ten fragment zawiera listę wszystkich nazw plików archiwum zip. Nazwy plików odnoszą się do katalogu głównego zip.

using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Read))
{
    for (int i = 0; i < archive.Entries.Count; i++)
    {
        Console.WriteLine($"{i}: {archive.Entries[i]}");
    }
}

Wyodrębnianie plików z plików ZIP

Rozpakowanie wszystkich plików do katalogu jest bardzo proste:

using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Read))
{
    archive.ExtractToDirectory(AppDomain.CurrentDomain.BaseDirectory);
}

Gdy plik już istnieje, zgłoszony zostanie wyjątek System.IO.IOException .

Wyodrębnianie określonych plików:

using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Read))
{
    // Get a root entry file
    archive.GetEntry("test.txt").ExtractToFile("test_extracted_getentries.txt", true);

    // Enter a path if you want to extract files from a subdirectory
    archive.GetEntry("sub/subtest.txt").ExtractToFile("test_sub.txt", true);

    // You can also use the Entries property to find files
    archive.Entries.FirstOrDefault(f => f.Name == "test.txt")?.ExtractToFile("test_extracted_linq.txt", true);

    // This will throw a System.ArgumentNullException because the file cannot be found
    archive.GetEntry("nonexistingfile.txt").ExtractToFile("fail.txt", true);
}

Każda z tych metod da ten sam wynik.

Aktualizowanie pliku ZIP

Aby zaktualizować plik ZIP, należy go otworzyć za pomocą ZipArchiveMode.Update.

using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Update))
{
    // Add file to root
    archive.CreateEntryFromFile("test.txt", "test.txt");

    // Add file to subfolder
    archive.CreateEntryFromFile("test.txt", "symbols/test.txt");
}

Istnieje również opcja zapisu bezpośrednio do pliku w archiwum:

var entry = archive.CreateEntry("createentry.txt");
using(var writer = new StreamWriter(entry.Open()))
{
    writer.WriteLine("Test line");
}


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow