カテゴリ: C# 更新日: 2025/12/21

C#でファイルの圧縮・解凍を行う方法(ZipArchiveクラス)を初心者向けに解説!

C#でファイルの圧縮・解凍を行う方法(ZipArchiveクラス)
C#でファイルの圧縮・解凍を行う方法(ZipArchiveクラス)

先生と生徒の会話形式で理解しよう

生徒

「先生、C#でフォルダやファイルをまとめて圧縮したり、逆に解凍したりすることってできますか?」

先生

「もちろんできますよ。C#ではZipArchiveクラスを使えば、簡単にZIPファイルの作成や展開(解凍)ができます。」

生徒

「圧縮って、ファイルを軽くすることですよね?どうしてそんなことができるんですか?」

先生

「そうです。圧縮とは、データを小さくまとめる技術のことです。ファイルをZIP形式にすると、サイズが小さくなって、メール添付やバックアップがしやすくなりますよ。」

生徒

「なるほど!それでは、C#でどうやって圧縮や解凍をするのか、教えてください!」

先生

「では、C#のZipArchiveクラスを使った具体的な方法を見ていきましょう。」

1. C#でZIPファイルを扱うには?

1. C#でZIPファイルを扱うには?
1. C#でZIPファイルを扱うには?

C#では、標準ライブラリ(特別な外部ライブラリを追加しなくても使える機能)の中に、ZIP形式の圧縮や解凍を行うクラスが用意されています。それが、System.IO.Compression名前空間にあるZipArchiveクラスです。

このクラスを使うと、フォルダの中のファイルを一括でZIP圧縮したり、逆にZIPファイルを展開(解凍)して元の状態に戻したりすることができます。

また、同じくSystem.IO.Compression.FileSystemをusingで追加することで、ZIPファイルを操作するための便利なメソッドが使えるようになります。

2. フォルダをZIPファイルに圧縮する方法

2. フォルダをZIPファイルに圧縮する方法
2. フォルダをZIPファイルに圧縮する方法

まずは、C#でフォルダをZIP形式にまとめる(圧縮する)方法を見てみましょう。ここでは、ZipFile.CreateFromDirectory()メソッドを使います。このメソッドは、指定したフォルダ全体をZIPファイルとして保存してくれる便利な関数です。


using System;
using System.IO.Compression;

class Program
{
    static void Main()
    {
        string sourceFolder = @"C:\TestFolder"; // 圧縮したいフォルダのパス
        string zipFilePath = @"C:\Backup\TestFolder.zip"; // 作成するZIPファイルの保存場所

        // フォルダをZIPファイルに圧縮
        ZipFile.CreateFromDirectory(sourceFolder, zipFilePath);

        Console.WriteLine("フォルダをZIPファイルに圧縮しました。");
    }
}

フォルダをZIPファイルに圧縮しました。

このコードを実行すると、C:\TestFolderの内容がすべてまとめられ、C:\Backup\TestFolder.zipというZIPファイルが作成されます。

なお、圧縮時にZIPファイル名がすでに存在する場合は上書きエラーになるため、事前にFile.Exists()で確認しておくのがおすすめです。

3. ZIPファイルを解凍する方法

3. ZIPファイルを解凍する方法
3. ZIPファイルを解凍する方法

次に、ZIPファイルを元のフォルダに戻す「解凍」の方法です。こちらもZipFile.ExtractToDirectory()メソッドを使うことで、簡単に展開できます。


using System;
using System.IO.Compression;

class Program
{
    static void Main()
    {
        string zipFilePath = @"C:\Backup\TestFolder.zip"; // 解凍するZIPファイル
        string extractPath = @"C:\RestoredFolder"; // 展開先のフォルダ

        // ZIPファイルを解凍
        ZipFile.ExtractToDirectory(zipFilePath, extractPath);

        Console.WriteLine("ZIPファイルを解凍しました。");
    }
}

ZIPファイルを解凍しました。

このコードを実行すると、ZIPファイルの中身がC:\RestoredFolderに展開されます。

もし展開先のフォルダがすでに存在している場合、ファイルの上書きエラーが発生することがあります。その場合は、解凍前にDirectory.Delete()で古いフォルダを削除しておくとよいでしょう。

4. ZipArchiveクラスを使ってファイル単位で操作する

4. ZipArchiveクラスを使ってファイル単位で操作する
4. ZipArchiveクラスを使ってファイル単位で操作する

ZipFile.CreateFromDirectory()ExtractToDirectory()は一括操作に便利ですが、個別にファイルを追加・削除したい場合は、ZipArchiveクラスを直接使う方法が適しています。

以下のサンプルでは、既存のZIPファイルに新しいファイルを追加する方法を紹介します。


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

class Program
{
    static void Main()
    {
        string zipPath = @"C:\Backup\TestFolder.zip";
        string newFilePath = @"C:\TestFolder\newfile.txt";

        using (FileStream zipToOpen = new FileStream(zipPath, FileMode.Open))
        {
            using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
            {
                // 新しいファイルをZIPに追加
                archive.CreateEntryFromFile(newFilePath, Path.GetFileName(newFilePath));
            }
        }

        Console.WriteLine("ZIPファイルに新しいファイルを追加しました。");
    }
}

ZIPファイルに新しいファイルを追加しました。

このように、ZipArchiveクラスを使うと、ZIPファイルの中身を柔軟に操作できます。ファイルを削除したり、内容を読み取ったりすることも可能です。

5. 圧縮レベルを指定してサイズを調整する

5. 圧縮レベルを指定してサイズを調整する
5. 圧縮レベルを指定してサイズを調整する

実は、C#では圧縮の強さ(圧縮レベル)を指定することもできます。例えば、「できるだけ軽くしたい」場合や「処理を早くしたい」場合に使い分けられます。


ZipFile.CreateFromDirectory(sourceFolder, zipFilePath, CompressionLevel.Optimal, false);
  • CompressionLevel.Fastest:処理速度重視で圧縮率が低い
  • CompressionLevel.Optimal:バランスの取れた圧縮率(おすすめ)
  • CompressionLevel.NoCompression:圧縮せずにそのまま保存

圧縮レベルを調整することで、バックアップやアーカイブなど、用途に合わせたファイルサイズにすることができます。

6. C#でZIPファイルを自在に扱おう

6. C#でZIPファイルを自在に扱おう
6. C#でZIPファイルを自在に扱おう

ここまでで紹介したように、C#ではZipFileZipArchiveを使うことで、ファイルやフォルダを簡単に圧縮・解凍できます。これらの機能を活用することで、データのバックアップ、ログ保存、配布用パッケージの作成など、さまざまなシーンで役立ちます。

初心者の方も、まずは小さなフォルダを実際にZIP化して動作を確認してみましょう。目に見える結果が得られるので、C#のファイル操作の理解が一気に深まりますよ。

まとめ

まとめ
まとめ

C#で学ぶファイル圧縮と解凍の基本的な考え方

この記事では、C#を使ってファイルやフォルダを圧縮・解凍する方法について、初心者向けに順を追って解説してきました。ZIP形式は、複数のファイルを一つにまとめられるだけでなく、ファイルサイズを小さくできるため、バックアップやデータ配布、ログ保存など、さまざまな場面で活用されています。C#では、標準機能としてSystem.IO.Compression名前空間が用意されており、特別な外部ライブラリを導入しなくてもZIPファイルを扱える点が大きな特徴です。

特にZipFileクラスとZipArchiveクラスを理解することで、「フォルダをまとめて圧縮する」「ZIPファイルを解凍する」「ZIPの中身を個別に操作する」といった実務でよく使われる処理を、シンプルなコードで実装できるようになります。ファイル操作は難しそうに感じがちですが、基本的な流れを押さえれば、C#初心者でも十分に扱える分野です。

ZipFileとZipArchiveの使い分けが重要

ZipFile.CreateFromDirectoryやZipFile.ExtractToDirectoryは、フォルダ全体を一括で圧縮・解凍したい場合に非常に便利です。数行のコードで処理が完結するため、バックアップ処理や簡易ツールの作成に向いています。一方で、ZIPファイルの中に特定のファイルだけを追加したい、不要なファイルを削除したいといった細かい制御が必要な場合には、ZipArchiveクラスを直接使う方法が適しています。

このように、目的に応じてクラスを使い分けることが、C#でのファイル圧縮・解凍を効率よく行うコツです。処理内容に合わない方法を選んでしまうと、コードが複雑になったり、後から修正しにくくなったりするため注意が必要です。

圧縮レベルと実用的な活用シーン

圧縮レベルを指定できる点も、C#でZIPファイルを扱う際の大きなポイントです。処理速度を重視したい場合、できるだけファイルサイズを小さくしたい場合など、用途によって最適な圧縮レベルは変わります。CompressionLevelを正しく選択することで、処理時間とファイルサイズのバランスを取りやすくなります。

実務では、定期的なバックアップ処理、ログファイルのアーカイブ、ユーザーに配布するデータのパッケージ化などでZIP圧縮が使われることが多くあります。今回学んだ内容は、そのまま業務アプリケーションや個人開発にも応用できる知識です。

サンプルプログラムで振り返るZIP操作

最後に、フォルダをZIPファイルに圧縮する基本的なサンプルをもう一度確認してみましょう。処理の流れを整理することで、ZIP操作の全体像がより明確になります。


using System;
using System.IO.Compression;

class Program
{
    static void Main()
    {
        string sourceFolder = @"C:\SampleData";
        string zipPath = @"C:\Archive\SampleData.zip";

        ZipFile.CreateFromDirectory(sourceFolder, zipPath, CompressionLevel.Optimal, false);

        Console.WriteLine("フォルダをZIP形式で圧縮しました。");
    }
}

このようなコードを書けるようになると、C#でのファイル管理やデータ整理が一気に楽になります。小さなサンプルから実際に動かしてみることで、理解がより深まるでしょう。

先生と生徒の振り返り会話

生徒「ZIPファイルって難しいと思っていましたが、C#の標準機能だけで簡単に扱えるんですね。」

先生「そうですね。ZipFileクラスを使えば、フォルダの圧縮や解凍はとてもシンプルです。」

生徒「ZipArchiveを使えば、ファイルを一つずつ追加したり削除したりできるのも便利だと思いました。」

先生「用途に応じて使い分けることが大切です。圧縮レベルも意識すると、実務でさらに役立ちますよ。」

生徒「バックアップや配布用データにも使えそうなので、実際に試してみます。」

先生「ぜひ試してください。今回学んだZIP操作は、C#のファイル処理を理解するうえで大きな一歩になります。」

カテゴリの一覧へ
新着記事
New1
C#
C#のメモリ管理とガーベジコレクションの基礎を理解しよう
New2
C#
C#の参照型と値型の違いを初心者向けにやさしく解説!
New3
C#
C#のクエリ式とメソッド式の書き換え方を完全ガイド!LINQの2つの書き方をマスター
New4
C#
C#の戻り値にタプルを使う方法!複数の値を返すテクニック
人気記事
No.1
Java&Spring記事人気No1
C#
C#で文字列が数値か判定する方法を解説!char.IsDigitやTryParseの基本
No.2
Java&Spring記事人気No2
C#
C#のLINQでOrderByを使った並び替えを完全ガイド!初心者でもわかるソート方法
No.3
Java&Spring記事人気No3
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.4
Java&Spring記事人気No4
C#
C#のrefとoutキーワードとは?引数の参照渡しを理解しよう
No.5
Java&Spring記事人気No5
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.6
Java&Spring記事人気No6
C#
C#の引数と戻り値の基本!値を受け渡し・返す仕組みを理解しよう
No.7
Java&Spring記事人気No7
C#
C#のラムダ式の書き方と構文を初心者向けに完全解説
No.8
Java&Spring記事人気No8
COBOL
COBOLの帳票レイアウトを美しく!可読性向上テクニックを徹底解説