Поделиться через


ZipArchive Класс

Определение

Представляет пакет сжатых файлов в формате ZIP архива.

public ref class ZipArchive : IDisposable
public class ZipArchive : IDisposable
type ZipArchive = class
    interface IDisposable
Public Class ZipArchive
Implements IDisposable
Наследование
ZipArchive
Реализации

Комментарии

Методы управления ZIP-архивами и их записями файлов распределены по трем классам: ZipFile, ZipArchiveи ZipArchiveEntry.

Кому Использовать
Create ZIP-архива из каталога ZipFile.CreateFromDirectory
Извлечение содержимого ZIP-архива в каталог ZipFile.ExtractToDirectory
Добавление новых файлов в существующий ZIP-архив ZipArchive.CreateEntry
Получение файла из ZIP-архива ZipArchive.GetEntry
Извлечение всех файлов из ZIP-архива ZipArchive.Entries
Открытие потока в один файл, содержащийся в ZIP-архиве ZipArchiveEntry.Open
Удаление файла из ZIP-архива ZipArchiveEntry.Delete

При создании новой записи файл сжимается и добавляется в ZIP-пакет. Метод CreateEntry позволяет указать иерархию каталогов при добавлении записи. Вы включаете относительный путь к новой записи в ZIP-пакет. Например, при создании новой записи с относительным путем создается сжатый текстовый AddedFolder\NewFile.txt файл в каталоге с именем AddedFolder.

Если вы ссылаетесь на сборку System.IO.Compression.FileSystem в проекте, вы можете получить доступ к четырем методам расширения (из ZipFileExtensions класса) для ZipArchive класса: CreateEntryFromFile(ZipArchive, String, String), CreateEntryFromFile(ZipArchive, String, String, CompressionLevel), ExtractToDirectory(ZipArchive, String)и ExtractToDirectory(ZipArchive, String, Boolean) (доступны в .NET Core 2.0 и более поздних версиях). Эти методы расширения позволяют сжимать и распаковывать содержимое записи в файл. Сборка System.IO.Compression.FileSystem недоступна для приложений Магазина Windows 8.x. В приложениях Магазина Windows 8.x можно сжимать и распаковывая DeflateStream файлы с помощью класса или GZipStream среда выполнения Windows типов Compressor и Decompressor.

Примеры

В первом примере показано, как создать новую запись и записать в нее с помощью потока.

using System;
using System.IO;
using System.IO.Compression;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            using (FileStream zipToOpen = new FileStream(@"c:\users\exampleuser\release.zip", FileMode.Open))
            {
                using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
                {
                    ZipArchiveEntry readmeEntry = archive.CreateEntry("Readme.txt");
                    using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
                    {
                            writer.WriteLine("Information about this package.");
                            writer.WriteLine("========================");
                    }
                }
            }
        }
    }
}
Imports System.IO
Imports System.IO.Compression

Module Module1

    Sub Main()
        Using zipToOpen As FileStream = New FileStream("c:\users\exampleuser\release.zip", FileMode.Open)
            Using archive As ZipArchive = New ZipArchive(zipToOpen, ZipArchiveMode.Update)
                Dim readmeEntry As ZipArchiveEntry = archive.CreateEntry("Readme.txt")
                Using writer As StreamWriter = New StreamWriter(readmeEntry.Open())
                    writer.WriteLine("Information about this package.")
                    writer.WriteLine("========================")
                End Using
            End Using
        End Using
    End Sub

End Module

В следующем примере показано, как открыть ZIP-архив и выполнить итерацию по коллекции записей.

using System;
using System.IO;
using System.IO.Compression;

class Program
{
    static void Main(string[] args)
    {
        string zipPath = @".\result.zip";

        Console.WriteLine("Provide path where to extract the zip file:");
        string extractPath = Console.ReadLine();

        // Normalizes the path.
        extractPath = Path.GetFullPath(extractPath);

        // Ensures that the last character on the extraction path
        // is the directory separator char.
        // Without this, a malicious zip file could try to traverse outside of the expected
        // extraction path.
        if (!extractPath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal))
            extractPath += Path.DirectorySeparatorChar;

        using (ZipArchive archive = ZipFile.OpenRead(zipPath))
        {
            foreach (ZipArchiveEntry entry in archive.Entries)
            {
                if (entry.FullName.EndsWith(".txt", StringComparison.OrdinalIgnoreCase))
                {
                    // Gets the full path to ensure that relative segments are removed.
                    string destinationPath = Path.GetFullPath(Path.Combine(extractPath, entry.FullName));

                    // Ordinal match is safest, case-sensitive volumes can be mounted within volumes that
                    // are case-insensitive.
                    if (destinationPath.StartsWith(extractPath, StringComparison.Ordinal))
                        entry.ExtractToFile(destinationPath);
                }
            }
        }
    }
}
Imports System.IO
Imports System.IO.Compression

Module Module1

    Sub Main()
        Dim zipPath As String = ".\result.zip"

        Console.WriteLine("Provide path where to extract the zip file:")
        Dim extractPath As String = Console.ReadLine()

        ' Normalizes the path.
        extractPath = Path.GetFullPath(extractPath)

        ' Ensures that the last character on the extraction path
        ' is the directory separator char. 
        ' Without this, a malicious zip file could try to traverse outside of the expected
        ' extraction path.
        If Not extractPath.EndsWith(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal) Then
            extractPath += Path.DirectorySeparatorChar
        End If

        Using archive As ZipArchive = ZipFile.OpenRead(zipPath)
            For Each entry As ZipArchiveEntry In archive.Entries
                If entry.FullName.EndsWith(".txt", StringComparison.OrdinalIgnoreCase) Then

                    ' Gets the full path to ensure that relative segments are removed.
                    Dim destinationPath As String = Path.GetFullPath(Path.Combine(extractPath, entry.FullName))
                    
                    ' Ordinal match is safest, case-sensitive volumes can be mounted within volumes that
                    ' are case-insensitive.
                    If destinationPath.StartsWith(extractPath, StringComparison.Ordinal) Then 
                        entry.ExtractToFile(destinationPath)
                    End If

                End If
            Next
        End Using
    End Sub

End Module

В третьем примере показано, как использовать методы расширения для создания новой записи в ZIP-архиве из существующего файла и извлечения содержимого архива. Для выполнения кода необходимо ссылаться на System.IO.Compression.FileSystem сборку.

using System;
using System.IO;
using System.IO.Compression;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            string zipPath = @"c:\users\exampleuser\start.zip";
            string extractPath = @"c:\users\exampleuser\extract";
            string newFile = @"c:\users\exampleuser\NewFile.txt";

            using (ZipArchive archive = ZipFile.Open(zipPath, ZipArchiveMode.Update))
            {
                archive.CreateEntryFromFile(newFile, "NewEntry.txt");
                archive.ExtractToDirectory(extractPath);
            }
        }
    }
}
Imports System.IO
Imports System.IO.Compression

Module Module1

    Sub Main()
        Dim zipPath As String = "c:\users\exampleuser\end.zip"
        Dim extractPath As String = "c:\users\exampleuser\extract"
        Dim newFile As String = "c:\users\exampleuser\NewFile.txt"

        Using archive As ZipArchive = ZipFile.Open(zipPath, ZipArchiveMode.Update)
            archive.CreateEntryFromFile(newFile, "NewEntry.txt", CompressionLevel.Fastest)
            archive.ExtractToDirectory(extractPath)
        End Using
    End Sub

End Module

Конструкторы

ZipArchive(Stream)

Инициализирует новый экземпляр класса ZipArchive из указанного потока.

ZipArchive(Stream, ZipArchiveMode)

Инициализирует новый экземпляр класса ZipArchive из указанного потока с указанным режимом.

ZipArchive(Stream, ZipArchiveMode, Boolean)

Инициализирует новый экземпляр класса ZipArchive в указанном потоке для указанного режима, а также при необходимости оставляет поток открытым.

ZipArchive(Stream, ZipArchiveMode, Boolean, Encoding)

Инициализирует новый экземпляр класса ZipArchive в указанном потоке для заданного режима, использует указанную кодировку для кодировку для имен записей, а также, при необходимости, оставляет поток открытым.

Свойства

Comment

Возвращает или задает необязательный архивный комментарий.

Entries

Получает коллекцию записей, которые находятся в ZIP-архиве в текущий момент.

Mode

Получает значение, которое описывает тип действий, которые ZIP-архив может выполнять на записях.

Методы

CreateEntry(String)

Создает пустую запись, которая имеет указанные путь и имя записи в ZIP архиве.

CreateEntry(String, CompressionLevel)

Создает пустую запись, которая имеет указанные имя и уровень сжатия ZIP записи в архиве.

Dispose()

Освобождает ресурсы, используемые текущим экземпляром класса ZipArchive.

Dispose(Boolean)

Вызывается методами Dispose() и Finalize(), чтобы освободить неуправляемые ресурсы, используемые текущим экземпляром класса ZipArchive, и необязательно заканчивает запись архива и высвобождает управляемые ресурсы.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetEntry(String)

Извлекает Программу-оболочку для заданной записи в ZIP-архиве.

GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

Методы расширения

CreateEntryFromFile(ZipArchive, String, String)

Архивирует файл, сжимая его и добавляя его в ZIP-архив.

CreateEntryFromFile(ZipArchive, String, String, CompressionLevel)

Архивирует файл, сжимая его с использованием заданного уровня сжатия и добавляя его в ZIP-архив.

ExtractToDirectory(ZipArchive, String)

Извлекает все файлы из ZIP-архива в каталог в файловой системе.

ExtractToDirectory(ZipArchive, String, Boolean)

Извлекает все файлы в архиве в каталог в файловой системе.

Применяется к

См. также раздел