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


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
Исходный код:
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
Исходный код:
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.CompressionSystem.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 вместо этого используйте метод.

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