ZipFileExtensions.ExtractToFile Metodo

Definizione

Estrae una voce nell'archivio ZIP in un file.

Overload

ExtractToFile(ZipArchiveEntry, String)

Estrae una voce nell'archivio ZIP in un file.

ExtractToFile(ZipArchiveEntry, String, Boolean)

Estrae una voce nell'archivio ZIP in un file e sovrascrive facoltativamente un file esistente con lo stesso nome.

ExtractToFile(ZipArchiveEntry, String)

Estrae una voce nell'archivio ZIP in un file.

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)

Parametri

source
ZipArchiveEntry

Voce dell'archivio ZIP da cui estrarre un file.

destinationFileName
String

Percorso del file da creare dal contenuto della voce. È possibile specificare un percorso relativo o assoluto. Un percorso relativo è interpretato rispetto alla directory di lavoro corrente.

Eccezioni

destinationFileName è una stringa di lunghezza zero, contiene solo spazi vuoti o contiene uno o più caratteri non validi definiti da InvalidPathChars.

-oppure-

destinationFileName specifica una directory.

destinationFileName è null.

Il percorso specificato, il nome file o entrambi superano la lunghezza massima definita dal sistema.

Il percorso specificato non è valido, ad esempio si trova in un'unità non mappata.

destinationFileName esiste già.

-oppure-

Si è verificato un errore di I/O.

-oppure-

La voce è attualmente aperta per la scrittura.

-oppure-

La voce è stata eliminata dall'archivio.

Il chiamante non ha le autorizzazioni necessarie per creare il nuovo file.

La voce non è presente nell'archivio o è danneggiata e non può essere letta.

-oppure-

La voce è stata compressa con un metodo di compressione non supportato.

L'archivio ZIP a cui appartiene questa voce è stato eliminato.

Il formato di destinationFileName non è valido.

-oppure-

L'archivio ZIP per questa voce è stato aperto nella modalità Create che non consente il recupero delle voci.

Esempio

Nell'esempio seguente viene illustrato come eseguire l'iterazione del contenuto di un file di archivio zip ed estrarre file con estensione .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

Commenti

Se il file di destinazione esiste già, questo metodo non lo sovrascrive; genera un'eccezione IOException . Per sovrascrivere un file esistente, usare invece l'overload del ExtractToFile(ZipArchiveEntry, String, Boolean) metodo.

L'ultima ora di scrittura del file viene impostata sull'ultima volta che la voce nell'archivio zip è stata modificata; questo valore viene archiviato nella LastWriteTime proprietà .

Non è possibile usare questo metodo per estrarre una directory; usare invece il ExtractToDirectory metodo.

Si applica a

ExtractToFile(ZipArchiveEntry, String, Boolean)

Estrae una voce nell'archivio ZIP in un file e sovrascrive facoltativamente un file esistente con lo stesso nome.

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)

Parametri

source
ZipArchiveEntry

Voce dell'archivio ZIP da cui estrarre un file.

destinationFileName
String

Percorso del file da creare dal contenuto della voce. È possibile specificare un percorso relativo o assoluto. Un percorso relativo è interpretato rispetto alla directory di lavoro corrente.

overwrite
Boolean

true per sovrascrivere un file esistente con lo stesso nome del file di destinazione. In caso contrario, false.

Eccezioni

destinationFileName è una stringa di lunghezza zero, contiene solo spazi vuoti o contiene uno o più caratteri non validi definiti da InvalidPathChars.

-oppure-

destinationFileName specifica una directory.

destinationFileName è null.

Il percorso specificato, il nome file o entrambi superano la lunghezza massima definita dal sistema.

Il percorso specificato non è valido, ad esempio si trova in un'unità non mappata.

destinationFileName esiste già e overwrite è false.

-oppure-

Si è verificato un errore di I/O.

-oppure-

La voce è attualmente aperta per la scrittura.

-oppure-

La voce è stata eliminata dall'archivio.

Il chiamante non ha le autorizzazioni necessarie per creare il nuovo file.

La voce risulta mancante dall'archivio o è danneggiata e non può essere letta.

-oppure-

La voce è stata compressa con un metodo di compressione non supportato.

L'archivio ZIP a cui appartiene questa voce è stato eliminato.

Il formato di destinationFileName non è valido.

-oppure-

L'archivio ZIP per questa voce è stato aperto nella modalità Create che non consente il recupero delle voci.

Esempio

Nell'esempio seguente viene illustrato come eseguire l'iterazione del contenuto di un file di archivio zip ed estrarre file con estensione .txt. Sovrascrive un file esistente con lo stesso nome nella cartella di destinazione. Per compilare questo esempio di codice, è necessario fare riferimento agli System.IO.Compression assembly e System.IO.Compression.FileSystem nel progetto.

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

Commenti

L'ultima ora di scrittura del file viene impostata sull'ultima volta che la voce nell'archivio zip è stata modificata; questo valore viene archiviato nella LastWriteTime proprietà .

Non è possibile usare questo metodo per estrarre una directory; usare invece il ExtractToDirectory metodo.

Si applica a