ZipArchive クラス

定義

zip アーカイブ形式の圧縮ファイルのパッケージを表します。

public ref class ZipArchive : IDisposable
public class ZipArchive : IDisposable
type ZipArchive = class
    interface IDisposable
Public Class ZipArchive
Implements IDisposable
継承
ZipArchive
実装

注釈

zip アーカイブとそのファイル エントリを操作するメソッドは、次の 3 つのクラスに分散されます。 ZipFileZipArchiveZipArchiveEntry

終了 使用
ディレクトリから zip アーカイブを作成する ZipFile.CreateFromDirectory
zip アーカイブの内容をディレクトリに抽出する ZipFile.ExtractToDirectory
既存の zip アーカイブに新しいファイルを追加する ZipArchive.CreateEntry
zip アーカイブからファイルを取得する ZipArchive.GetEntry
zip アーカイブからすべてのファイルを取得する ZipArchive.Entries
zip アーカイブに含まれる 1 つのファイルへのストリームを開く ZipArchiveEntry.Open
zip アーカイブからファイルを削除する ZipArchiveEntry.Delete

新しいエントリを作成すると、ファイルが圧縮され、zip パッケージに追加されます。 この CreateEntry メソッドを使用すると、エントリを追加するときにディレクトリ階層を指定できます。 新しいエントリの相対パスを zip パッケージ内に含めます。 たとえば、相対パスを持つ新しいエントリを作成すると、AddedFolder という名前の AddedFolder\NewFile.txt ディレクトリに圧縮テキスト ファイルが作成されます。

プロジェクトでアセンブリをSystem.IO.Compression.FileSystem参照する場合は、(クラスからZipFileExtensions) ZipArchive クラス ExtractToDirectory(ZipArchive, String)CreateEntryFromFile(ZipArchive, String, String)CreateEntryFromFile(ZipArchive, String, String, CompressionLevel)ExtractToDirectory(ZipArchive, String, Boolean) の 4 つの拡張メソッド (.NET Core 2.0 以降のバージョンで利用可能) にアクセスできます。 これらの拡張メソッドを使用すると、エントリの内容をファイルに圧縮および展開できます。 アセンブリはSystem.IO.Compression.FileSystem、Windows 8.x ストア アプリでは使用できません。 Windows 8.x ストア アプリでは、またはGZipStreamクラスを使用してファイルをDeflateStream圧縮および展開できます。または、Windows ランタイム型CompressorDecompressor.

最初の例では、新しいエントリを作成し、ストリームを使用して書き込む方法を示します。

using System;
using System.IO;
using System.IO.Compression;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            using (FileStream zipToOpen = new FileStream(@"c:\users\exampleuser\release.zip", FileMode.Open))
            {
                using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
                {
                    ZipArchiveEntry readmeEntry = archive.CreateEntry("Readme.txt");
                    using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
                    {
                            writer.WriteLine("Information about this package.");
                            writer.WriteLine("========================");
                    }
                }
            }
        }
    }
}
Imports System.IO
Imports System.IO.Compression

Module Module1

    Sub Main()
        Using zipToOpen As FileStream = New FileStream("c:\users\exampleuser\release.zip", FileMode.Open)
            Using archive As ZipArchive = New ZipArchive(zipToOpen, ZipArchiveMode.Update)
                Dim readmeEntry As ZipArchiveEntry = archive.CreateEntry("Readme.txt")
                Using writer As StreamWriter = New StreamWriter(readmeEntry.Open())
                    writer.WriteLine("Information about this package.")
                    writer.WriteLine("========================")
                End Using
            End Using
        End Using
    End Sub

End Module

次の例は、zip アーカイブを開き、エントリのコレクションを反復処理する方法を示しています。

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

3 番目の例は、拡張メソッドを使用して、既存のファイルから zip アーカイブに新しいエントリを作成し、アーカイブの内容を抽出する方法を示しています。 コードを実行するには、 System.IO.Compression.FileSystem アセンブリを参照する必要があります。

using System;
using System.IO;
using System.IO.Compression;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            string zipPath = @"c:\users\exampleuser\start.zip";
            string extractPath = @"c:\users\exampleuser\extract";
            string newFile = @"c:\users\exampleuser\NewFile.txt";

            using (ZipArchive archive = ZipFile.Open(zipPath, ZipArchiveMode.Update))
            {
                archive.CreateEntryFromFile(newFile, "NewEntry.txt");
                archive.ExtractToDirectory(extractPath);
            }
        }
    }
}
Imports System.IO
Imports System.IO.Compression

Module Module1

    Sub Main()
        Dim zipPath As String = "c:\users\exampleuser\end.zip"
        Dim extractPath As String = "c:\users\exampleuser\extract"
        Dim newFile As String = "c:\users\exampleuser\NewFile.txt"

        Using archive As ZipArchive = ZipFile.Open(zipPath, ZipArchiveMode.Update)
            archive.CreateEntryFromFile(newFile, "NewEntry.txt", CompressionLevel.Fastest)
            archive.ExtractToDirectory(extractPath)
        End Using
    End Sub

End Module

コンストラクター

ZipArchive(Stream)

指定したストリームから ZipArchive クラスの新しいインスタンスを初期化します。

ZipArchive(Stream, ZipArchiveMode)

指定したストリームと指定したモードから ZipArchive クラスの新しいインスタンスを初期化します。

ZipArchive(Stream, ZipArchiveMode, Boolean)

指定されたモードの指定されたストリームで ZipArchive クラスの新しいインスタンスを初期化し、必要に応じて、ストリームを開いたままにします。

ZipArchive(Stream, ZipArchiveMode, Boolean, Encoding)

指定されたモードの指定されたストリームで ZipArchive クラスの新しいインスタンスを初期化し、エントリ名に指定されたエンコーディングを使用します。また、必要に応じて、ストリームを開いたままにします。

プロパティ

Comment

オプションのアーカイブ コメントを取得または設定します。

Entries

現在 zip アーカイブ内にあるエントリのコレクションを取得します。

Mode

zip アーカイブがエントリで実行できる操作の種類を示す値を取得します。

メソッド

CreateEntry(String)

指定したパスとエントリ名を持つ空のエントリを zip アーカイブに作成します。

CreateEntry(String, CompressionLevel)

指定したエントリ名と圧縮レベルを持つ空のエントリを zip アーカイブに作成します。

Dispose()

ZipArchive クラスの現在のインスタンスによって使用されているリソースを解放します。

Dispose(Boolean)

Dispose() クラスの現在のインスタンスによって使用されるアンマネージド リソースを解放するために、Finalize() メソッドと ZipArchive メソッドによって呼び出されます。オプションで、アーカイブの書き込みを終了し、マネージド リソースを解放できます。

Equals(Object)

指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。

(継承元 Object)
GetEntry(String)

zip アーカイブ内の指定したエントリのラッパーを取得します。

GetHashCode()

既定のハッシュ関数として機能します。

(継承元 Object)
GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
MemberwiseClone()

現在の Object の簡易コピーを作成します。

(継承元 Object)
ToString()

現在のオブジェクトを表す文字列を返します。

(継承元 Object)

拡張メソッド

CreateEntryFromFile(ZipArchive, String, String)

圧縮し、zip アーカイブに追加することでファイルをアーカイブします。

CreateEntryFromFile(ZipArchive, String, String, CompressionLevel)

指定した圧縮レベルで圧縮し、zip アーカイブに追加することでファイルをアーカイブします。

ExtractToDirectory(ZipArchive, String)

zip アーカイブのすべてのファイルをファイル システムのディレクトリに抽出します。

ExtractToDirectory(ZipArchive, String, Boolean)

アーカイブのすべてのファイルをファイル システムのディレクトリに抽出します。

適用対象

こちらもご覧ください