次の方法で共有


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 は長さ 0 の文字列か、空白のみで構成されるか、または InvalidPathCharsで定義される 1 つ以上の正しくない文字を含んでいます。

- または -

destinationFileName がディレクトリを指定しています。

destinationFileNamenullです。

指定したパス、ファイル名、またはその両方がシステム定義の最大長を超えています。

指定されたパスが正しくありません (たとえば、マップされていないドライブにあるなど)。

destinationFileName が既に存在します。

- または -

I/O エラーが発生しました。

- または -

エントリは現在書き込み用に開かれています

- または -

エントリはアーカイブから削除されました。

呼び出し元に、新しいファイルの作成に必要なアクセス許可がありません。

エントリがアーカイブにないか、または破損していて読み取ることができません。

- または -

サポートされていない圧縮方式を使用してエントリが圧縮されています。

このエントリが属している 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 は長さ 0 の文字列か、空白のみで構成されるか、または InvalidPathCharsで定義される 1 つ以上の正しくない文字を含んでいます。

- または -

destinationFileName がディレクトリを指定しています。

destinationFileNamenullです。

指定したパス、ファイル名、またはその両方がシステム定義の最大長を超えています。

指定されたパスが正しくありません (たとえば、マップされていないドライブにあるなど)。

destinationFileName が既に存在し、overwritefalse です。

- または -

I/O エラーが発生しました。

- または -

エントリは現在書き込み用に開かれています

- または -

エントリはアーカイブから削除されました。

呼び出し元に、新しいファイルの作成に必要なアクセス許可がありません。

エントリがアーカイブにないか、破損して読み取ることができません。

- または -

サポートされていない圧縮方式を使用してエントリが圧縮されています。

このエントリが属している 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 使用してください。

適用対象