はじめに
C#では、ファイルの圧縮と解凍を簡単に行うことができます。特に、.NETフレームワークに含まれるSystem.IO.Compression名前空間を活用することで、ZIPファイルの操作が非常に簡単になります。本記事では、C#を使ってファイルやディレクトリの圧縮・解凍を行う方法について詳しく解説します。
圧縮と解凍の基本
圧縮は、ファイルやディレクトリのサイズを小さくする技術で、ストレージの節約やデータ転送の効率化に役立ちます。ZIP形式は最も一般的な圧縮フォーマットの一つで、C#でも簡単に取り扱うことができます。
C#では、主に以下のクラスを使って圧縮・解凍を行います:
ZipFile: ZIPファイルの作成や解凍を行うクラス。ZipArchive: ZIPファイルの中のエントリ(ファイルやディレクトリ)を操作するクラス。
ZIPファイルの作成(圧縮)
まず、C#でファイルやフォルダをZIP形式で圧縮する方法を見ていきます。ZipFile.CreateFromDirectory()メソッドを使うと、ディレクトリ全体を簡単にZIPファイルに圧縮できます。
ディレクトリをZIPファイルに圧縮する例
using System;
using System.IO.Compression;
class Program
{
static void Main()
{
string sourceDirectory = @"C:\example\sourceDir";
string zipPath = @"C:\example\compressed.zip";
// ディレクトリ全体をZIPファイルに圧縮
ZipFile.CreateFromDirectory(sourceDirectory, zipPath);
Console.WriteLine("ディレクトリが圧縮されました。");
}
}
解説:
CreateFromDirectory: 指定したディレクトリをZIPファイルとして圧縮します。- 第一引数に圧縮対象のディレクトリ、第二引数に出力されるZIPファイルのパスを指定します。
2.2. 単一ファイルを圧縮する例
単一のファイルを圧縮する場合は、FileStreamとGZipStreamを使用します。
using System;
using System.IO;
using System.IO.Compression;
class Program
{
static void Main()
{
string filePath = @"C:\example\file.txt";
string compressedFilePath = @"C:\example\file.txt.gz";
using (FileStream originalFileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
using (FileStream compressedFileStream = new FileStream(compressedFilePath, FileMode.Create))
using (GZipStream compressionStream = new GZipStream(compressedFileStream, CompressionMode.Compress))
{
originalFileStream.CopyTo(compressionStream);
}
Console.WriteLine("ファイルが圧縮されました。");
}
}
ZIPファイルの解凍
次に、圧縮されたZIPファイルを解凍する方法を見ていきましょう。ZipFile.ExtractToDirectory()メソッドを使うと、ZIPファイルの内容を簡単に解凍できます。
ZIPファイルを解凍する例
using System;
using System.IO.Compression;
class Program
{
static void Main()
{
string zipPath = @"C:\example\compressed.zip";
string extractPath = @"C:\example\extractedDir";
// ZIPファイルをディレクトリに解凍
ZipFile.ExtractToDirectory(zipPath, extractPath);
Console.WriteLine("ZIPファイルが解凍されました。");
}
}
解説:
ExtractToDirectory: 指定したZIPファイルを解凍し、その内容を指定されたディレクトリに展開します。
3.2. 単一ファイルを解凍する例
.gz形式で圧縮された単一ファイルを解凍するには、GZipStreamを再び使用します。
using System;
using System.IO;
using System.IO.Compression;
class Program
{
static void Main()
{
string compressedFilePath = @"C:\example\file.txt.gz";
string decompressedFilePath = @"C:\example\file_decompressed.txt";
using (FileStream compressedFileStream = new FileStream(compressedFilePath, FileMode.Open))
using (FileStream decompressedFileStream = new FileStream(decompressedFilePath, FileMode.Create))
using (GZipStream decompressionStream = new GZipStream(compressedFileStream, CompressionMode.Decompress))
{
decompressionStream.CopyTo(decompressedFileStream);
}
Console.WriteLine("ファイルが解凍されました。");
}
}
解説:
CompressionMode.Decompress: 解凍モードを指定しています。- 圧縮された
.gzファイルを読み取り、元のファイルに解凍して保存しています。
ZIPファイルの内容を操作
ZIPファイルの中の特定のファイルやディレクトリにアクセスしたり操作する場合は、ZipArchiveクラスを使用します。このクラスを使用すると、ZIPファイル内のエントリを列挙したり、特定のファイルを操作できます。
ZIPファイルの内容をリストする例
using System;
using System.IO;
using System.IO.Compression;
class Program
{
static void Main()
{
string zipPath = @"C:\example\compressed.zip";
using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
Console.WriteLine($"エントリ名: {entry.FullName}, サイズ: {entry.Length} バイト");
}
}
}
}
解説:
ZipFile.OpenRead: ZIPファイルを読み込み専用で開きます。archive.Entriesを使うことで、ZIPファイル内のすべてのエントリ(ファイルやフォルダ)を列挙できます。
圧縮・解凍時の注意点
パスの長さ制限
Windowsにはパスの長さ制限があり、特にディレクトリやファイルの階層が深い場合、ZIPファイルを解凍するときにエラーが発生する可能性があります。最新のWindowsバージョンでは、レジストリ設定で長いパスを有効にすることができますが、古いシステムをサポートする場合は注意が必要です。
ファイルアクセス権
圧縮・解凍するファイルやディレクトリに対するアクセス権限にも注意が必要です。特に、共有フォルダやシステムフォルダなどの特定の場所にアクセスする際は、管理者権限が必要になる場合があります。
まとめ
C#では、System.IO.Compression名前空間を使って簡単にファイルやディレクトリの圧縮・解凍を行うことができます。ZipFileクラスを使った一括圧縮や解凍、ZipArchiveクラスを使った細かいファイル操作など、柔軟な方法でファイルを管理できます。また、圧縮・解凍時のパフォーマンスやアクセス権限に注意しながら、安全にファイル操作を行いましょう。

コメント