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


ZipFileExtensions.ExtractToFile Метод

Определение

Извлекает запись в ZIP-архиве в файл.

Перегрузки

ExtractToFile(ZipArchiveEntry, String)

Извлекает запись в ZIP-архиве в файл.

ExtractToFile(ZipArchiveEntry, String, Boolean)

Извлекает запись из ZIP-архива в файл и при необходимости перезаписывает существующий файл с тем же именем.

ExtractToFile(ZipArchiveEntry, String)

Исходный код:
ZipFileExtensions.ZipArchiveEntry.Extract.cs
Исходный код:
ZipFileExtensions.ZipArchiveEntry.Extract.cs
Исходный код:
ZipFileExtensions.ZipArchiveEntry.Extract.cs

Извлекает запись в ZIP-архиве в файл.

public:
[System::Runtime::CompilerServices::Extension]
 static void ExtractToFile(System::IO::Compression::ZipArchiveEntry ^ source, System::String ^ destinationFileName);
public static void ExtractToFile (this System.IO.Compression.ZipArchiveEntry source, string destinationFileName);
static member ExtractToFile : System.IO.Compression.ZipArchiveEntry * string -> unit
<Extension()>
Public Sub ExtractToFile (source As ZipArchiveEntry, destinationFileName As String)

Параметры

source
ZipArchiveEntry

ZIP-архив, из которого извлекается файл.

destinationFileName
String

Путь к файлу, создаваемому из содержимого записи. Можно указать относительный или абсолютный путь. Относительный путь интерпретируется относительно текущего рабочего каталога.

Исключения

destinationFileName представляет собой строку нулевой длины, содержащую только пробелы или один или несколько недопустимых символов, заданных методом InvalidPathChars.

-или-

Параметр destinationFileName задает каталог.

destinationFileName имеет значение null.

Указанный путь, имя файла или оба значения превышают максимальную длину, заданную в системе.

Указан недопустимый путь (например, он ведет на несопоставленный диск).

destinationFileName уже существует.

-или-

Ошибка ввода/вывода.

-или-

Запись в текущий момент открыта для записи.

-или-

Запись была удалена из архива.

Вызывающий объект не имеет необходимых разрешений на создание нового файла.

Запись в архиве отсутствует либо была повреждена и ее невозможно прочитать.

-или-

Запись была сжата с использованием неподдерживаемого метода сжатия.

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

Параметр destinationFileName задан в недопустимом формате.

-или-

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

Примеры

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

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

Комментарии

Если целевой файл уже существует, этот метод не перезаписывает его; вызывает исключение IOException . Чтобы перезаписать существующий файл, используйте перегрузку ExtractToFile(ZipArchiveEntry, String, Boolean) метода.

Время последней записи файла — время последнего изменения записи в ZIP-архиве; это значение хранится в свойстве LastWriteTime .

Этот метод нельзя использовать для извлечения каталога; вместо этого используйте ExtractToDirectory метод .

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

ExtractToFile(ZipArchiveEntry, String, Boolean)

Исходный код:
ZipFileExtensions.ZipArchiveEntry.Extract.cs
Исходный код:
ZipFileExtensions.ZipArchiveEntry.Extract.cs
Исходный код:
ZipFileExtensions.ZipArchiveEntry.Extract.cs

Извлекает запись из ZIP-архива в файл и при необходимости перезаписывает существующий файл с тем же именем.

public:
[System::Runtime::CompilerServices::Extension]
 static void ExtractToFile(System::IO::Compression::ZipArchiveEntry ^ source, System::String ^ destinationFileName, bool overwrite);
public static void ExtractToFile (this System.IO.Compression.ZipArchiveEntry source, string destinationFileName, bool overwrite);
static member ExtractToFile : System.IO.Compression.ZipArchiveEntry * string * bool -> unit
<Extension()>
Public Sub ExtractToFile (source As ZipArchiveEntry, destinationFileName As String, overwrite As Boolean)

Параметры

source
ZipArchiveEntry

ZIP-архив, из которого извлекается файл.

destinationFileName
String

Путь к файлу, создаваемому из содержимого записи. Можно указать относительный или абсолютный путь. Относительный путь интерпретируется относительно текущего рабочего каталога.

overwrite
Boolean

Значение true, чтобы перезаписывался существующий файл с тем же именем, что и файл назначения; в противном случае — значение false.

Исключения

destinationFileName представляет собой строку нулевой длины, содержащую только пробелы или один или несколько недопустимых символов, заданных методом InvalidPathChars.

-или-

Параметр destinationFileName задает каталог.

destinationFileName имеет значение null.

Указанный путь, имя файла или оба значения превышают максимальную длину, заданную в системе.

Указан недопустимый путь (например, он ведет на несопоставленный диск).

Имя, заданное в параметре destinationFileName, уже существует, а параметр overwrite имеет значение false.

-или-

Ошибка ввода/вывода.

-или-

Запись в текущий момент открыта для записи.

-или-

Запись была удалена из архива.

Вызывающий объект не имеет необходимых разрешений на создание нового файла.

Запись в архиве отсутствует или была повреждена, и ее невозможно прочитать.

-или-

Запись была сжата с использованием неподдерживаемого метода сжатия.

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

Параметр destinationFileName задан в недопустимом формате.

-или-

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

Примеры

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

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string zipPath = @"c:\example\start.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))
                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, true);
                    }
                }
            }
        }
    }
}
Imports System.IO
Imports System.IO.Compression

Module Module1

    Sub Main()
        Dim zipPath As String = "c:\example\start.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) 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, true)
                    End If

                End If
            Next
        End Using
    End Sub

End Module

Комментарии

Время последней записи файла — время последнего изменения записи в ZIP-архиве; это значение хранится в свойстве LastWriteTime .

Этот метод нельзя использовать для извлечения каталога; вместо этого используйте ExtractToDirectory метод .

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