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 アーカイブを作成します。 |
ExtractToDirectory | zip アーカイブを解凍して、指定したフォルダに展開します。 |
Open | モードを指定して zip アーカイブを開きます。モードは「読み取り」と「書き込み」、「アップデート」の3種類があります。 |
OpenRead | 読み取り専用で zip アーカイブを開きます。 |
ZipArchive クラスについて
ZipArchive クラスは、zip ファイルにアクセスするためのメソッドとプロパティを提供しています。
メソッド | 内容 |
---|---|
CreateEntry | 既存の zip アーカイブに新しいファイルを追加します。 |
GetEntry | zip アーカイブ内のファイルを取得します。 |
プロパティ | 内容 |
---|---|
Entries | zip アーカイブ内の全てのファイルを取得します。 |
ZipArchiveEntry クラスについて
zip ファイルに含まれるファイルやフォルダの情報を保持するクラスです。ファイル名やサイズ、最終更新日時などを保持するプロパティやファイルの内容を取得したり削除するメソッドが用意されています。
メソッド | 内容 |
---|---|
Open | zip アーカイブ内のファイル(エントリー)を開きます。 |
Delete | zip アーカイブ内のファイル(エントリー)を削除します。 |
プロパティ | 内容 |
---|---|
Name | zip アーカイブ内のファイル(エントリー)名を取得します。 |
FulName | zip アーカイブ内のファイル(エントリー)の相対パスを取得します。 |
Length | zip アーカイブ内のファイル(エントリー)の圧縮前のサイズを取得します。 |
CompressedLength | zip アーカイブ内のファイル(エントリー)の圧縮サイズを取得します。 |
LastWriteTime | zip アーカイブ内のファイル(エントリー)の最終更新日を取得します。 |
IsEncrypted | zip アーカイブ内のファイル(エントリー)が暗号化されているかどうかを取得します。 |
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 ファイルの解凍したい場合は、ぜひ参考にしてみてください。
以上、最後まで読んで頂きありがとうございました。