> 作業効率UP!! オススメのモバイルモニターを紹介

【C#】zipファイルの圧縮および解凍する方法を紹介

当ページのリンクには広告が含まれています。
  • URLをコピーしました!

C#でフォルダの圧縮、zipファイルの解凍をしたい。。。

C# で フォルダの圧縮、zipファイルの解凍をするには .NET(.NET Framework 4.5 以上)で標準で搭載されている ZipFile クラス、ZipArchive クラスを使用します。

これらのクラスを扱うことで、C# で zip ファイルの操作を行うことが可能です。

この記事では、画像やサンプルコードを用いて分かりやすく解説していますので、ぜひ参考にしてみてください。

オススメの参考書

C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。

zipファイルとは

zipファイルとは、複数のファイルやフォルダを1つのアーカイブにまとめ、それを圧縮するためのファイル形式です。ファイルの拡張子は「.zip」です。

ファイルを圧縮することで容量を小さくできるので、PC のストレージの節約やメールなどでデータを送信する際に利用します。また、zipファイルは暗号化が可能で、ファイルの内容をパスワードで保護することができます。

zipファイルのデータを取り出すには解凍する必要があります。解凍すると元のファイルが復元されます。

C#でzipファイルを扱うには?

C# で フォルダの圧縮、zipファイルの解凍をするには .NET(.NET Framework 4.5 以上)で標準で搭載されている ZipFile クラス、ZipArchive クラス、ZipArchiveEntry クラスを使用します。

これらのクラスを使うには System.IO.Compression を参照設定します。

using System.IO.Compression;

ZipFile クラスについて

ZipFile クラスは、zip ファイルを作成したり、zip ファイルを展開(解凍)したりするためのメソッドを提供しています。

メソッド内容
CreateFromDirectory指定したフォルダから zip アーカイブを作成します。
ExtractToDirectoryzip アーカイブを解凍して、指定したフォルダに展開します。
Openモードを指定して zip アーカイブを開きます。モードは「読み取り」と「書き込み」、「アップデート」の3種類があります。
OpenRead読み取り専用で zip アーカイブを開きます。
ZipFile のメソッド一覧

ZipArchive クラスについて

ZipArchive クラスは、zip ファイルにアクセスするためのメソッドとプロパティを提供しています。

メソッド内容
CreateEntry既存の zip アーカイブに新しいファイルを追加します。
GetEntryzip アーカイブ内のファイルを取得します。
ZipArchive のメソッド一覧
プロパティ内容
Entrieszip アーカイブ内の全てのファイルを取得します。
ZipArchive のプロパティ一覧

ZipArchiveEntry クラスについて

zip ファイルに含まれるファイルやフォルダの情報を保持するクラスです。ファイル名やサイズ、最終更新日時などを保持するプロパティやファイルの内容を取得したり削除するメソッドが用意されています。

メソッド内容
Openzip アーカイブ内のファイル(エントリー)を開きます。
Deletezip アーカイブ内のファイル(エントリー)を削除します。
ZipArchiveEntry のメソッド一覧
プロパティ内容
Namezip アーカイブ内のファイル(エントリー)名を取得します。
FulNamezip アーカイブ内のファイル(エントリー)の相対パスを取得します。
Lengthzip アーカイブ内のファイル(エントリー)の圧縮前のサイズを取得します。
CompressedLengthzip アーカイブ内のファイル(エントリー)の圧縮サイズを取得します。
LastWriteTimezip アーカイブ内のファイル(エントリー)の最終更新日を取得します。
IsEncryptedzip アーカイブ内のファイル(エントリー)が暗号化されているかどうかを取得します。
ZipArchiveEntry のプロパティ一覧

C#でzipを扱う方法

C#で zip を扱う方法について紹介します。簡単なソースコードも紹介していますので、参考にしてみてください。

環境

  • 統合開発環境:Visual Studio 2022
  • フレームワーク:.NET 7.0

フォルダを圧縮する

フォルダを圧縮したい場合は ZipFile クラスのCreateFromDirectoryメソッドを使用します。

ZipFile.CreateFromDirectory()

メソッドの引数には、「圧縮するフォルダのパス」「作成する圧縮ファイルのパス」「圧縮レベル」などを指定できます。

圧縮レベルには次の4種類が選択できます。

種類内容
CompressionLevel.Fastest圧縮速度を優先して圧縮を行う
CompressionLevel.Optimal圧縮速度とサイズのバランスを取って圧縮を行う
CompressionLevel.SmallestSizeサイズを優先して圧縮を行う
CompressionLevel.NoCompression圧縮を行わない

次のコードはZipFile.CreateFromDirectoryメソッドを使ったフォルダを圧縮するサンプルです。

public void Compress(string folder, string zipFile, bool isOverwrite = false, CompressionLevel compressionLevel = CompressionLevel.Optimal)
{
    if (!Directory.Exists(folder))
    {
        return;
    }

    if (File.Exists(zipFile))
    {
        if (!isOverwrite) 
        {
            return;
        }

        File.Delete(zipFile);
    }

    // フォルダの圧縮を行う
    ZipFile.CreateFromDirectory(folder, zipFile, compressionLevel, true);
}

第1引数のfolderは圧縮したいフォルダのパス、第2引数のzipFileは zip ファイルのパス、第3引数のappendは同じ zip ファイルが既にある場合に上書きするかどうかを指定、第4引数のcompressionLevelは圧縮レベルを指定します。

Compress(@"C:\Users\admin\testfile", @"C:\Users\admin\testfile.zip", true);

実行結果は次の通りです。

圧縮

フォルダを解凍する

フォルダを解凍したい場合は ZipFile クラスのExtractToDirectoryメソッドを使用します。

ZipFile.ExtractToDirectory()

メソッドの引数には、「解凍する zip ファイルのパス」「解凍先となるフォルダのパス」「既に解凍先に同じフォルダがあった場合に上書きするかどうか」などを指定できます。上書きする場合はtrue、上書きしない場合はfalseを指定します。

次のコードはZipFile.ExtractToDirectoryメソッドを使った zip ファイルを解凍するサンプルです。

public void Extract(string zipFile, string outputFolder = "", bool isOverwrite = false)
{
    if (!File.Exists(zipFile) || !Path.GetExtension(zipFile).Equals(".zip"))
    {
        return;
    }

    if (string.IsNullOrEmpty(outputFolder))
    {
        outputFolder = zipFile.Substring(0, zipFile.Length - Path.GetExtension(zipFile).Length);
    }

    // zipファイルを指定のフォルダに解凍する
    ZipFile.ExtractToDirectory(zipFile, outputFolder, isOverwrite);
}

第1引数のzipFileは解凍したい zip ファイルのパス、第2引数のoutputFolderは zip ファイルの解凍先となるフォルダのパス、第3引数のisOverwriteは解凍先に既に同じフォルダがある場合に上書きするかどうかを指定します。

CExtract(@"C:\Users\admin\testfile.zip", @"C:\Users\admin\testfile", true);

実行結果は次の通りです。

解凍

zipアーカイブのエントリーの情報を取得する

zip アーカイブのエントリー(フォルダ、ファイル)の情報を取得するには ZipFile クラスのOpenReadメソッドを使用します。

ZipFile.OpenRead()

メソッドの引数には「情報を取得する zip ファイルのパス」を指定します。このメソッドはZipArchiveEntryオブジェクトを返します。

次のコードはZipFile.OpenReadメソッドを使った zip ファイルの情報を取得するサンプルです。

public void ReadInfo(string zipFile)
{
    using (ZipArchive archive = ZipFile.OpenRead(zipFile))
    {
        foreach (ZipArchiveEntry entry in archive.Entries)
        {
            if (entry.Name == "")
            {
                Debug.WriteLine("空のフォルダです");
                continue;
            }

            Debug.WriteLine($"Name:{entry.Name}");
            Debug.WriteLine($"FullName:{entry.FullName}");
            Debug.WriteLine($"Length:{entry.Length}byte");
            Debug.WriteLine($"CompressedLength:{entry.CompressedLength}byte");
            Debug.WriteLine($"LastWriteTime:{entry.LastWriteTime}");
            Debug.WriteLine($"ExternalAttributes:{entry.ExternalAttributes}");
        }
    }
}

まとめ

この記事では、C# で zip アーカイブの操作方法について説明しました。

System.IO.Compression 名前空間に定義されているクラスを使うことで、フォルダの圧縮や zip ファイルの解凍、zip ファイルの情報を取得することができます。

  • ZipFile クラス
  • ZipArchive クラス
  • ZipArchiveEntry クラス

C# でフォルダの圧縮や zip ファイルの解凍したい場合は、ぜひ参考にしてみてください。

以上、最後まで読んで頂きありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!