C#でzipの圧縮する方法は?展開をする方法も紹介!

- システム
エンジニア - C#でzipファイルを圧縮したり、展開したりする場合、どのようなソースコードを書くのですか。
- プロジェクト
マネージャー - それでは、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を入れています。
- システム
エンジニア - サンプルを参考にして自分でもソースコードを書いてみます。
- プロジェクト
マネージャー - そうですね。C#ではzipファイルの扱いについてさまざまな機能が提供されていますので、実際に自分でソースコードを書いてみてください。
C#のzipファイルを実践してみよう
C#のzipファイル圧縮や展開について説明しましたが、いかがでしたでしょうか。思ったより簡単にzipファイルを扱うことが出来ることがわかります。
この記事を参考にして、C#でzipを扱うプログラムを是非作ってください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


C#新着案件New Job
-
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(新宿駅) -
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(新宿駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円神奈川県横浜市(桜木町駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円神奈川県横浜市(桜木町駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(西新宿駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(西新宿駅)