
C#でzipの圧縮する方法は?展開をする方法も紹介!
- SE
- C#でzipファイルを圧縮したり、展開したりする場合、どのようなソースコードを書くのですか。
- PM
- それでは、C#のzipファイル圧縮や展開について、サンプルを見てもらいながら解説いたしましょう。
目次
C#によるzip圧縮展開とは?
zipファイルについて、多くの人はご存じでしょう。Windowsでも標準の機能として、ファイルの右クリックで「送る」を実行することでzip圧縮ができます。また、zipファイルを右クリックで展開することもできます。
C#でも、zipファイルの扱いについて様々な機能が提供されています。今回はそれぞれの機能を紹介するので、C#でzip圧縮や展開などを行いたい人は、是非ご覧ください。
C#によるzip圧縮と展開
まず、簡単なC#のサンプルを見ていきましょう。以下を実行する場合は、先頭に「using System.IO.Compression;」を追加してください。
ZipFile.CreateFromDirectory(“”c:\\test””, “”c:\\test2\\test.zip””);
ZipFile.ExtractToDirectory(“”c:\\test2\\test.zip””, “”c:\\test2\\test””);
このサンプルでは、cドライブにあるtestというフォルダをtest2フォルダのtest.zipに圧縮します。その後、そのtest.zipを同じtest2フォルダに展開して戻します。
zip圧縮時のオプション指定
ZipFileクラスのCreateFromDirectoryは、さらに2つのオプションを付けることができます。CompressionLevel.Fastestを付けると速度優先、CompressionLevel.Optimalではサイズ優先になります。
以下のサンプルでは圧縮処理の時間を計測できます。実行をする場合は、先頭に「using System;」、もしくは「using System.IO.Compression;」を追加してください。
var s = new System.Diagnostics.Stopwatch();
s.Start(); // 計測開始
ZipFile.CreateFromDirectory(“”c:\\test””, “”c:\\test2\\test.zip””, CompressionLevel.Fastest, true);
s.Stop(); // 計測終了
TimeSpan t = s.Elapsed;
Console.WriteLine(t.Seconds+””秒 “”+t.Milliseconds+””ミリ秒””);
私のPCで50MBの写真のビットマップファイルで試したところ、CompressionLevelがFastestの時は約3秒で約35MBに圧縮され、Optimalでは約5秒で約31MBに圧縮されました。なおCompressionLevelを指定してない場合は、Optimalになっています。
4つ目のパラメーターでは、ルートのフォルダも含めるかどうかを指定します。この例だとtestフォルダを含めて圧縮するかどうかを決められます。
zip展開時のオプション指定
ZipFileクラスのExtractToDirectoryにも、オプション指定ができます。
ZipFile.ExtractToDirectory(“”c:\\test2\\test.zip””, “”c:\\test2\\test””,true);
上のように3つ目のパラメータにtrueを指定すると、展開先に同名のファイルがある場合は上書きをします。falseの場合は、IOExceptionが発生します。このパラメータを指定しない場合も同様に発生します。
なおCreateFromDirectoryにはないオプションなので、同名のzipファイルがある場合は、IOExceptionが発生します。try~catchで囲むなど、Exception対策をしておきましょう。
zipファイルの内容を取得する
C#では、zipファイルの中身にどんなファイルがあるかをチェックすることができます。以下がそのサンプルです。
using (ZipArchive za = ZipFile.OpenRead(“”C:\\test\\test.zip””))
{
foreach (ZipArchiveEntry en in za.Entries)
{
Console.WriteLine(“”ファイル名 “” + en.Name);
Console.WriteLine(“”圧縮サイズ “” + en.CompressedLength+””byte””);
Console.WriteLine(“”更新日時 “” + en.LastWriteTime);
Console.WriteLine();
}
}
ZipArchiveで中身の情報を取得できる
上のサンプルでは、まず ZipFile.OpenReadでファイルを開き、ZipArchiveを取り出しています。この時usingを使用していますが、これはusing {}を抜けた後に、必ず終了処理を行っているC#の機能です。
そして、ZipArchiveが持っているZipArchiveEntryにアクセスしています。zip内のファイルの数だけ、ZipArchiveEntryが存在します。これによりzip内のファイルの情報を取得し、表示をしています。
このサンプルを実行すると以下のような結果になります。
ファイル名 a.txt
圧縮サイズ 1949byte
更新日時 2020/05/14 13:38:40 +09:00
ファイル名 b.png
圧縮サイズ 198473byte
更新日時 2014/05/24 14:48:06 +09:00
zip内の一部のファイルを展開する
C#ではzip内の一部のファイルを取り出すことができます。以下がそのサンプルです。
using (ZipArchive za = ZipFile.OpenRead(“”C:\\test\\test.zip””))
{
ZipArchiveEntry en = za.GetEntry(“”test/a.txt””);
if (en!=null)
{
en.ExtractToFile(“”C:\\test\\a.txt””);
}
}
ZipArchiveEntryのExtractToFileで中身を手軽に取り出せます。
zip内のファイルを削除する
zip内の一部のファイルを削除することも可能です。以下がC#のサンプルです。
using (ZipArchive za = ZipFile.Open(“”C:\\test\\test.zip””, ZipArchiveMode.Update))
{
ZipArchiveEntry en = za.GetEntry(“”test/a.txt””);
if (en != null)
{
en.Delete();
}
}
ZipFile.OpenReadではなく、ZipFile.OpenでZipArchiveMode.Updateを指定していることに注意してください。OpenReadで開くと更新ができないので、NotSupportedExceptionが発生します。
zip内にファイルを追加する
zip内にファイルを追加することもできます。以下がC#のサンプルです。
using (ZipArchive za = ZipFile.Open(“”C:\\test\\test.zip””, ZipArchiveMode.Update))
{
ZipArchiveEntry en = za.CreateEntryFromFile(“”C:\\test\\c.txt””, “”c.txt””);
}
既存のファイルc.txtを、同名のc.txtとしてzip内に追加しています。
zip内にフォルダを追加する
以下のようにすればzip内にファイルだけでなく、フォルダも追加できます。
using (ZipArchive za = ZipFile.Open(“”C:\\test\\test.zip””, ZipArchiveMode.Update))
{
ZipArchiveEntry fo = za.CreateEntry(“”folder\\””);
ZipArchiveEntry en = za.CreateEntryFromFile(“”C:\\test\\c.txt””, “”folder\\c.txt””);
}
“”フォルダ名+\\””でフォルダを作成し、そのフォルダにc.txtを入れています。
- SE
- サンプルを参考にして自分でもソースコードを書いてみます。
- PM
- そうですね。C#ではzipファイルの扱いについてさまざまな機能が提供されていますので、実際に自分でソースコードを書いてみてください。
C#のzipファイルを実践してみよう
C#のzipファイル圧縮や展開について説明しましたが、いかがでしたでしょうか。思ったより簡単にzipファイルを扱うことが出来ることがわかります。
この記事を参考にして、C#でzipを扱うプログラムを是非作ってください。