【C#】ファイルをzip形式で圧縮・解凍する

C#

C#でファイルをzip形式で圧縮するのは意外と簡単です。しかし、.Net Frameworkのバージョンによっては思わぬ落とし穴があります。

zip形式で圧縮のサンプル

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

class Program
{
    static void Main(string[] args)
    {
        string sourceFile = @"C:\path\to\your\file.txt"; // 圧縮するファイルのパス
        string destinationZip = @"C:\path\to\your\file.zip"; // 出力されるZIPファイルのパス

        try
        {
            // ZIPファイルを作成し、指定されたファイルを圧縮する
            using (FileStream zipToOpen = new FileStream(destinationZip, FileMode.Create))
            {
                using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create))
                {
                    // 圧縮するファイルをZIPアーカイブに追加
                    ZipArchiveEntry zipEntry = archive.CreateEntryFromFile(sourceFile, Path.GetFileName(sourceFile));
                }
            }
            Console.WriteLine("ファイルが正常に圧縮されました。");
        }
        catch (Exception ex)
        {
            Console.WriteLine("エラーが発生しました: " + ex.Message);
        }
    }
}

重要な部分の解説

  • using System.IO.Compression; この行は、ZIP圧縮機能を使うために必要な名前空間をインポートしています。ZipArchive クラスなど、圧縮に関連するクラスが含まれています。
  • FileStream zipToOpen = new FileStream(destinationZip, FileMode.Create) この行では、出力されるZIPファイルを開くために FileStream オブジェクトを作成しています。FileMode.Create を指定することで、ファイルが存在しない場合は新規作成し、存在する場合は上書きします。
  • ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create) ここでは、ZipArchive オブジェクトを作成しています。これにより、ZIPファイルの中に新しいエントリ(圧縮されたファイル)を追加することができます。ZipArchiveMode.Create は、新しいZIPアーカイブを作成することを意味します。
  • ZipArchiveEntry zipEntry = archive.CreateEntryFromFile(sourceFile, Path.GetFileName(sourceFile)) この行では、指定されたファイルをZIPアーカイブに追加しています。CreateEntryFromFile メソッドは、圧縮するファイルのパスと、アーカイブ内でのファイル名(ここでは元のファイル名を使用)を引数に取ります。
  • catch (Exception ex) この部分は、プロセス中に何らかのエラー(例えば、ファイルが見つからない、アクセス権限がないなど)が発生した場合に、例外をキャッチしてエラーメッセージを表示します。

zip形式のファイルを解凍のサンプル

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

class Program
{
    static void Main(string[] args)
    {
        string sourceZip = @"C:\path\to\your\file.zip"; // 解凍するZIPファイルのパス
        string extractPath = @"C:\path\to\extract"; // 解凍したファイルを保存するディレクトリのパス

        try
        {
            // ZIPファイルを開き、指定されたパスに内容を解凍する
            ZipFile.ExtractToDirectory(sourceZip, extractPath);
            Console.WriteLine("ファイルが正常に解凍されました。");
        }
        catch (Exception ex)
        {
            Console.WriteLine("エラーが発生しました: " + ex.Message);
        }
    }
}

重要な部分の解説

  • ZipFile.ExtractToDirectory(sourceZip, extractPath); この行で、ZipFile.ExtractToDirectory メソッドを使用して、指定されたZIPファイルからすべてのファイルとディレクトリを指定されたパスに解凍しています。このメソッドは非常に便利で、ZIPファイル内のすべての内容を一度に解凍できます。
  • catch (Exception ex) この部分では、解凍プロセス中に発生した可能性のある例外をキャッチしています。例えば、指定されたZIPファイルが見つからない、アクセスできない、または出力先のディレクトリに問題がある場合など、さまざまな理由でエラーが発生する可能性があります。
  • このサンプルコードを使用することで、ZIPファイルを簡単に解凍できます。ただし、解凍先のディレクトリが存在しない場合は、ExtractToDirectory メソッドは新しくディレクトリを作成します。また、同名のファイルが解凍先に既に存在する場合は、例外が発生しますので、適切なエラーハンドリングを行うことが重要です。

ビルド時にエラーが出る場合

エラー CS0246 型または名前空間の名前 'ZipArchive' が見つかりませんでした (using ディレクティブまたはアセンブリ参照が指定されていることを確認してください)

上記のようなエラーが発生する場合はアセンブリが不足しているためアセンブリの参照が必要です。以下の手順で参照を追加してください。

1.参照の追加を選択

参照マネージャ画面で「System.IO.Compression」を検索。下記画像の2つにチェックを入れてOKボタンを押下。これでエラーが解消されるはずです。

タイトルとURLをコピーしました