.NETでzipアーカイブを操作する

最近、私の.NET / C#プロジェクトでは、zipアーカイブを作成および解凍する機能が必要でした。 Windowsエクスプローラーがzipファイルを長年使用できることを考えると、非常に簡単な操作のように思えます。Microsoftがそれらを使用するためのAPIを提供することを提案しました。



.NETフレームワークでzipを操作するためのクラスが不足していることは、私にとって大きな驚きではありませんでしたが、それでも私はあまり満足していませんでした。 さまざまなアンマネージWindows API(WinAPI、COMインターフェイスなど)でzipを使用するための機能が不足していることに悩まされました。 現時点では、プロジェクトのソースコード全体が私によって開発されており、最も単純な機能のため、追加のサードパーティの.dllファイルを配布キットに含めたくありませんでした。





インターネットとmsdnを検索した後、次のソリューションから選択しました。

  1. .NET FrameworkにはSystem.IO.Packaging.ZipPackageクラスがありますが、私が理解しているように、それを使用してzipアーカイブを操作することはできません。さらに、.NET 3.5でのみ表示されます。 このクラスはMS.Internal.IO.Zip.ZipArchiveクラスを使用しますが、名前が示すように、このクラスへのアクセスは閉じられています。 なぜだろうか。
  2. .NET Framework for J#にはjava.util.zip.ZipFileクラスがあり、MSDNにはC#からそれを使用する方法に関する記事があります。 しかし、Visual J#Frameworkは.NET Frameworkの一部ではないため、 Visual J#再頒布可能パッケージをディストリビューションに含める必要があります。これは、3.6メガバイトのコードであり、一般に私には役に立ちません。 エレガントすぎません。
  3. minizip -Cで書かれたzlibのアドオン .NETで使用するには、dllアセンブリと相互運用機能が必要です。
  4. サードパーティのSharpZipLibおよびDotNetZipライブラリ 。 両方とも完全に記述されており、かなり幅広い機能を提供します。


シェルAPIを使用してzipファイルを操作するための別のオプションがありますが、個人的にはあまりにも倒錯しているようで、たとえば、メモリ内のzipアーカイブを解凍しても機能しません。



上記のオプションはどれも私に完全に合っていなかったので、自分で開発することにしました。 .NET Frameworkには、deflateアルゴリズムに基づいてデータをパックおよびアンパックできるSystem.IO.Compression.DeflateStreamクラスがあります。 仕様に記載されているzipアーカイブの内部構造の読み取り/書き込みができることだけが必要です。



その結果、数日で、ファイルシステムとメモリの両方でzipファイルを再パックおよび作成できる小さくシンプルなライブラリを開発しました。



もちろん、ZIP形式全体(暗号化、さまざまな圧縮アルゴリズム、追加フィールドなど)を完全にサポートしているわけではありません。元々の作業量であり、上記のソリューションはいずれもそれを提供していません。 私の解決策は、アーカイブ形式がライブラリによってサポートされており、アーカイブがアプリケーションユーザーから直接取得されないことが事前にわかっている場合にのみ受け入れられます。 私のプロジェクトでは、これらの要件が満たされているため、開発されたソリューションは私に完全に適合しました。



ドキュメントと便利なAPIを使用して、オープンソースライブラリを開発するタスクを設定しませんでした。 私は、サードパーティのライブラリを使用せずに、.NETからZIPを操作する例を示し、例を挙げたかっただけです。



ここからソースと例をダウンロードしてください



誰かが便利になると嬉しいです:)






All Articles