ZipFileExtensions.ExtractToFile Metod

Definition

Extraherar en post i zip-arkivet till en fil.

Överlagringar

Name Description
ExtractToFile(ZipArchiveEntry, String)

Extraherar en post i zip-arkivet till en fil.

ExtractToFile(ZipArchiveEntry, String, Boolean)

Extraherar en post i zip-arkivet till en fil och skriver eventuellt över en befintlig fil som har samma namn.

ExtractToFile(ZipArchiveEntry, String)

Extraherar en post i zip-arkivet till en fil.

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)

Parametrar

source
ZipArchiveEntry

Post för zip-arkiv för att extrahera en fil från.

destinationFileName
String

Sökvägen till filen som ska skapas från innehållet i posten. Du kan ange antingen en relativ eller en absolut sökväg. En relativ sökväg tolkas som relativ till den aktuella arbetskatalogen.

Undantag

destinationFileName är en sträng med noll längd, innehåller endast tomt utrymme eller innehåller ett eller flera ogiltiga tecken som definieras av InvalidPathChars.

-eller-

destinationFileName anger en katalog.

destinationFileName är null.

Den angivna sökvägen, filnamnet eller båda överskrider den systemdefinierade maximala längden.

Den angivna sökvägen är ogiltig (den finns till exempel på en ommappad enhet).

destinationFileName redan finns.

-eller-

Ett I/O-fel uppstod.

-eller-

Posten är för närvarande öppen för skrivning.

-eller-

Posten har tagits bort från arkivet.

Anroparen har inte den behörighet som krävs för att skapa den nya filen.

Posten saknas i arkivet eller är skadad och kan inte läsas.

-eller-

Posten har komprimerats med hjälp av en komprimeringsmetod som inte stöds.

Zip-arkivet som den här posten tillhör har tagits bort.

destinationFileName är i ett ogiltigt format.

-eller-

Zip-arkivet för den här posten öppnades i Create läge, vilket inte tillåter hämtning av poster.

Exempel

I följande exempel visas hur du itererar genom innehållet i en zip-arkivfil och extraherar filer som har ett .txt-tillägg.

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

Kommentarer

Om målfilen redan finns skriver den här metoden inte över den. det utlöser ett IOException undantag. Om du vill skriva över en befintlig fil använder du ExtractToFile(ZipArchiveEntry, String, Boolean) metodens överlagring i stället.

Den sista skrivtiden för filen är inställd på den senaste gången posten i zip-arkivet ändrades. det här värdet lagras i egenskapen LastWriteTime .

Du kan inte använda den här metoden för att extrahera en katalog. ExtractToDirectory använd metoden i stället.

Gäller för

ExtractToFile(ZipArchiveEntry, String, Boolean)

Extraherar en post i zip-arkivet till en fil och skriver eventuellt över en befintlig fil som har samma namn.

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)

Parametrar

source
ZipArchiveEntry

Post för zip-arkiv för att extrahera en fil från.

destinationFileName
String

Sökvägen till filen som ska skapas från innehållet i posten. Du kan ange antingen en relativ eller en absolut sökväg. En relativ sökväg tolkas som relativ till den aktuella arbetskatalogen.

overwrite
Boolean

trueför att skriva över en befintlig fil som har samma namn som målfilen. annars . false

Undantag

destinationFileName är en sträng med noll längd, innehåller endast tomt utrymme eller innehåller ett eller flera ogiltiga tecken som definieras av InvalidPathChars.

-eller-

destinationFileName anger en katalog.

destinationFileName är null.

Den angivna sökvägen, filnamnet eller båda överskrider den systemdefinierade maximala längden.

Den angivna sökvägen är ogiltig (den finns till exempel på en ommappad enhet).

destinationFileName finns redan och overwrite är false.

-eller-

Ett I/O-fel uppstod.

-eller-

Posten är för närvarande öppen för skrivning.

-eller-

Posten har tagits bort från arkivet.

Anroparen har inte den behörighet som krävs för att skapa den nya filen.

Posten saknas i arkivet eller är skadad och kan inte läsas.

-eller-

Posten har komprimerats med hjälp av en komprimeringsmetod som inte stöds.

Zip-arkivet som den här posten tillhör har tagits bort.

destinationFileName är i ett ogiltigt format.

-eller-

Zip-arkivet för den här posten öppnades i Create läge, vilket inte tillåter hämtning av poster.

Exempel

I följande exempel visas hur du itererar igenom innehållet i en zip-arkivfil och extraherar filer som har ett .txt-tillägg. Den skriver över en befintlig fil som har samma namn i målmappen. För att kunna kompilera det här kodexemplet måste du referera till System.IO.Compression sammansättningarna och System.IO.Compression.FileSystem i projektet.

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

Kommentarer

Den sista skrivtiden för filen är inställd på den senaste gången posten i zip-arkivet ändrades. det här värdet lagras i egenskapen LastWriteTime .

Du kan inte använda den här metoden för att extrahera en katalog. ExtractToDirectory använd metoden i stället.

Gäller för