ZipFileExtensions.ExtractToFile メソッド

定義

zip アーカイブのエントリをファイルに抽出します。Extracts an entry in the zip archive to a file.

オーバーロード

ExtractToFile(ZipArchiveEntry, String)

zip アーカイブのエントリをファイルに抽出します。Extracts an entry in the zip archive to a file.

ExtractToFile(ZipArchiveEntry, String, Boolean)

zip アーカイブ内のエントリをファイルに抽出して、必要に応じて、同じ名前を持つ既存のファイルを上書きします。Extracts an entry in the zip archive to a file, and optionally overwrites an existing file that has the same name.

ExtractToFile(ZipArchiveEntry, String)

zip アーカイブのエントリをファイルに抽出します。Extracts an entry in the zip archive to a 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)

パラメーター

source
ZipArchiveEntry

ファイルを抽出する zip アーカイブ エントリ。The zip archive entry to extract a file from.

destinationFileName
String

エントリの内容から作成するファイルのパス。The path of the file to create from the contents of the entry. 相対パスまたは絶対パスを指定できます。You can specify either a relative or an absolute path. 相対パスは、現在の作業ディレクトリに対して相対的に解釈されます。A relative path is interpreted as relative to the current working directory.

例外

destinationFileName は長さ 0 の文字列か、空白のみで構成されるか、または InvalidPathCharsで定義される 1 つ以上の正しくない文字を含んでいます。destinationFileName is a zero-length string, contains only white space, or contains one or more invalid characters as defined by InvalidPathChars.

- または --or- destinationFileName がディレクトリを指定しています。destinationFileName specifies a directory.

destinationFileNamenullです。destinationFileName is null.

指定したパス、ファイル名、またはその両方がシステム定義の最大長を超えています。The specified path, file name, or both exceed the system-defined maximum length.

指定されたパスが正しくありません (たとえば、マップされていないドライブにあるなど)。The specified path is invalid (for example, it is on an unmapped drive).

destinationFileName が既に存在します。destinationFileName already exists.

- または --or- I/O エラーが発生しました。An I/O error occurred.

- または --or- エントリは現在書き込み用に開かれていますThe entry is currently open for writing.

- または --or- エントリはアーカイブから削除されました。The entry has been deleted from the archive.

呼び出し元に、新しいファイルの作成に必要なアクセス許可がありません。The caller does not have the required permission to create the new file.

エントリがアーカイブにないか、または破損していて読み取ることができません。The entry is missing from the archive, or is corrupt and cannot be read.

- または --or-

サポートされていない圧縮方式を使用してエントリが圧縮されています。The entry has been compressed by using a compression method that is not supported.

このエントリが属している zip アーカイブが破棄されました。The zip archive that this entry belongs to has been disposed.

destinationFileName の形式が正しくありません。destinationFileName is in an invalid format.

- または --or- このエントリの zip アーカイブが Create モードで開かれています。このモードでは、エントリの取得が許可されません。The zip archive for this entry was opened in Create mode, which does not permit the retrieval of entries.

次の例は、zip アーカイブファイルの内容を反復処理し、拡張子が .txt のファイルを抽出する方法を示しています。The following example shows how to iterate through the contents of a zip archive file and extract files that have a .txt extension.

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 れます。If the destination file already exists, this method does not overwrite it; it throws an IOException exception. 既存のファイルを上書きするには、 ExtractToFile(ZipArchiveEntry, String, Boolean) 代わりにメソッドオーバーロードを使用します。To overwrite an existing file, use the ExtractToFile(ZipArchiveEntry, String, Boolean) method overload instead.

ファイルの最終書き込み時刻は、zip アーカイブ内のエントリが最後に変更されたときに設定されます。この値は、プロパティに格納され LastWriteTime ます。The last write time of the file is set to the last time the entry in the zip archive was changed; this value is stored in the LastWriteTime property.

このメソッドを使用してディレクトリを抽出することはできません。代わりに、 ExtractToDirectory メソッドを使用してください。You cannot use this method to extract a directory; use the ExtractToDirectory method instead.

適用対象

ExtractToFile(ZipArchiveEntry, String, Boolean)

zip アーカイブ内のエントリをファイルに抽出して、必要に応じて、同じ名前を持つ既存のファイルを上書きします。Extracts an entry in the zip archive to a file, and optionally overwrites an existing file that has the same name.

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 アーカイブ エントリ。The zip archive entry to extract a file from.

destinationFileName
String

エントリの内容から作成するファイルのパス。The path of the file to create from the contents of the entry. 相対パスと絶対パスのどちらかを指定することができます。You can specify either a relative or an absolute path. 相対パスは、現在の作業ディレクトリに対して相対的に解釈されます。A relative path is interpreted as relative to the current working directory.

overwrite
Boolean

宛先ファイルと同じ名前の既存のファイルを上書きする場合は true。それ以外の場合は falsetrue to overwrite an existing file that has the same name as the destination file; otherwise, false.

例外

destinationFileName は長さ 0 の文字列か、空白のみで構成されるか、または InvalidPathCharsで定義される 1 つ以上の正しくない文字を含んでいます。destinationFileName is a zero-length string, contains only white space, or contains one or more invalid characters as defined by InvalidPathChars.

- または --or- destinationFileName がディレクトリを指定しています。destinationFileName specifies a directory.

destinationFileNamenullです。destinationFileName is null.

指定したパス、ファイル名、またはその両方がシステム定義の最大長を超えています。The specified path, file name, or both exceed the system-defined maximum length.

指定されたパスが正しくありません (たとえば、マップされていないドライブにあるなど)。The specified path is invalid (for example, it is on an unmapped drive).

destinationFileName が既に存在し、overwritefalse です。destinationFileName already exists and overwrite is false.

- または --or- I/O エラーが発生しました。An I/O error occurred.

- または --or- エントリは現在書き込み用に開かれていますThe entry is currently open for writing.

- または --or- エントリはアーカイブから削除されました。The entry has been deleted from the archive.

呼び出し元に、新しいファイルの作成に必要なアクセス許可がありません。The caller does not have the required permission to create the new file.

エントリがアーカイブにないか、破損して読み取ることができません。The entry is missing from the archive or is corrupt and cannot be read.

- または --or-

サポートされていない圧縮方式を使用してエントリが圧縮されています。The entry has been compressed by using a compression method that is not supported.

このエントリが属している zip アーカイブが破棄されました。The zip archive that this entry belongs to has been disposed.

destinationFileName の形式が正しくありません。destinationFileName is in an invalid format.

- または --or- このエントリの zip アーカイブが Create モードで開かれています。このモードでは、エントリの取得が許可されません。The zip archive for this entry was opened in Create mode, which does not permit the retrieval of entries.

次の例は、zip アーカイブファイルの内容を反復処理し、拡張子が .txt のファイルを抽出する方法を示しています。The following example shows how to iterate through the contents of a zip archive file, and extract files that have a .txt extension. コピー先フォルダーに同じ名前の既存のファイルが上書きされます。It overwrites an existing file that has the same name in the destination folder. このコード例をコンパイラするには、 System.IO.Compression プロジェクトでアセンブリとアセンブリを参照する必要があり System.IO.Compression.FileSystem ます。In order to compiler this code example, you must reference the System.IO.Compression and System.IO.Compression.FileSystem assemblies in your project.

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 ます。The last write time of the file is set to the last time the entry in the zip archive was changed; this value is stored in the LastWriteTime property.

このメソッドを使用してディレクトリを抽出することはできません。代わりに、 ExtractToDirectory メソッドを使用してください。You cannot use this method to extract a directory; use the ExtractToDirectory method instead.

適用対象