C#でファイルの圧縮・解凍を行う方法(ZipArchiveクラス)を初心者向けに解説!
生徒
「先生、C#でフォルダやファイルをまとめて圧縮したり、逆に解凍したりすることってできますか?」
先生
「もちろんできますよ。C#ではZipArchiveクラスを使えば、簡単にZIPファイルの作成や展開(解凍)ができます。」
生徒
「圧縮って、ファイルを軽くすることですよね?どうしてそんなことができるんですか?」
先生
「そうです。圧縮とは、データを小さくまとめる技術のことです。ファイルをZIP形式にすると、サイズが小さくなって、メール添付やバックアップがしやすくなりますよ。」
生徒
「なるほど!それでは、C#でどうやって圧縮や解凍をするのか、教えてください!」
先生
「では、C#のZipArchiveクラスを使った具体的な方法を見ていきましょう。」
1. C#でZIPファイルを扱うには?
C#では、標準ライブラリ(特別な外部ライブラリを追加しなくても使える機能)の中に、ZIP形式の圧縮や解凍を行うクラスが用意されています。それが、System.IO.Compression名前空間にあるZipArchiveクラスです。
このクラスを使うと、フォルダの中のファイルを一括でZIP圧縮したり、逆にZIPファイルを展開(解凍)して元の状態に戻したりすることができます。
また、同じくSystem.IO.Compression.FileSystemをusingで追加することで、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ファイルを解凍する方法
次に、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クラスを使ってファイル単位で操作する
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. 圧縮レベルを指定してサイズを調整する
実は、C#では圧縮の強さ(圧縮レベル)を指定することもできます。例えば、「できるだけ軽くしたい」場合や「処理を早くしたい」場合に使い分けられます。
ZipFile.CreateFromDirectory(sourceFolder, zipFilePath, CompressionLevel.Optimal, false);
- CompressionLevel.Fastest:処理速度重視で圧縮率が低い
- CompressionLevel.Optimal:バランスの取れた圧縮率(おすすめ)
- CompressionLevel.NoCompression:圧縮せずにそのまま保存
圧縮レベルを調整することで、バックアップやアーカイブなど、用途に合わせたファイルサイズにすることができます。
6. まとめ:C#でZIPファイルを自在に扱おう
ここまでで紹介したように、C#ではZipFileやZipArchiveを使うことで、ファイルやフォルダを簡単に圧縮・解凍できます。これらの機能を活用することで、データのバックアップ、ログ保存、配布用パッケージの作成など、さまざまなシーンで役立ちます。
初心者の方も、まずは小さなフォルダを実際にZIP化して動作を確認してみましょう。目に見える結果が得られるので、C#のファイル操作の理解が一気に深まりますよ。