Поиск…


Вступление

Класс ZipFile живет в пространстве имен System.IO.Compression . Его можно использовать для чтения и записи в Zip-файлы.

замечания

  • Вы также можете использовать MemoryStream вместо FileStream.

  • Исключения

исключение Состояние
ArgumentException Поток уже закрыт или возможности потока не соответствуют режиму (например: попытка записи в поток только для чтения)
ArgumentNullException входной поток равен нулю
ArgumentOutOfRangeException режим имеет недопустимое значение
InvalidDataException См. Список ниже

Когда выбрано InvalidDataException , оно может иметь 3 причины:

  • Содержимое потока не может быть интерпретировано как zip-архив
  • mode - это обновление, и запись отсутствует в архиве или повреждена и не может быть прочитана
  • mode - обновление, и запись слишком велика, чтобы вписаться в память

Вся информация была взята с этой страницы MSDN

Отображение содержимого ZIP

В этом фрагменте будут перечислены все имена файлов zip-архива. Имена файлов относятся к корню 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]}");
    }
}

Извлечение файлов из ZIP-файлов

Извлечение всех файлов в каталог очень просто:

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

Когда файл уже существует, будет выведено сообщение System.IO.IOException .

Извлечение определенных файлов:

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);
}

Любой из этих методов даст тот же результат.

Обновление ZIP-файла

Чтобы обновить ZIP-файл, файл должен быть открыт с помощью 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");
}

Существует также возможность записи непосредственно в файл в архиве:

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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow