じゃんぬさんの System.IO.Compression.GZipStream クラスというエントリを見ていて思い出したわけですが、いまやっているプロジェクトでインストーラ(もどき)を作るのに GZipStream クラスを使ってました。インストーラ(だから本当にもどき)が使うデータファイル(中身はインストールするファイル群)を圧縮して持っておくべきだろうなあということで。
最初は System.IO.Compression 名前空間をいろいろ調べていて、DeflateStream クラスで圧縮しておこうと思ったのだけど、これって Deflate アルゴリズムそのものを使えるようにしてくれるだけで、いくら Deflate アルゴリズムが ZIP 形式に採用されているとは言っても ZIP ファイルを作ってくれるわけではないと。
で、使うファイルは複数あるし、それを全部バラバラなファイルのまま圧縮するのも…と思うので、できればまとめて1個のファイルにして圧縮しておきたいわけです。でも System.IO.Compression 名前空間のクラスは1ファイルの圧縮しかしてくれないので、ファイルをまとめる処理は自分で書かなくちゃいけない。この場合独自形式でもいいけれど、独自形式にするとファイルを作るためのアプリケーションを作らなくちゃいけないので、だったらファイル形式さえ自分で何とかしてしまえばファイル作れるんじゃね?と考えたんですよ。
ただ ZIP ファイルは複雑そうでちょっと('A`)マンドクセ、なので TAR ファイルにして GZipStream クラスで圧縮すれば tar.gz ファイルが作れちゃうということで、このへんを参考にして自分で TAR ファイルを作ることにしました。TAR だったらヘッダ部分以外はただ連結するだけなので楽だし。
ちなみに SharpZipLib を使うとか J# のクラスを使うという方法は「ファイルをまとめようとしているのになんで別の DLL を用意せなあかんねん」ということで却下しました。
と、そんな昔話はどうでもいいとして(いいのかよ)シャノンさんのコメントで
System.IO.Packagingはどうなんだろうか(未調査
とか書かれていて、(゚Д゚≡゚Д゚)System.IO.Packagingッテナニナニ?! ということで調べてみました。
この辺によれば、どうやら .NET Framework 3.0 で実装される予定のものらしいですね。System.IO.Packaging.ZipPackage というクラスを使えばお金なんかちょっとでふわふわ! ZIP ファイルもらくらく!うおーすっげーな!でも .NET Framework 3.0… ○| ̄|_
(はわわ、ご主人様、敵が来ちゃいました!!.NET Framework 3.0 って予定どころかすでにリリースされてるじゃん!ということで修正)
余談ですが、Googleで「だがzipで」を検索すると「ぽぴンち。」が一番先頭に来る件について(2007年03月18日現在)。
# 要望があれば今回作った Tar クラスを少し整備して公開してみようかと思います。あくまで「要望があれば」ですが :-)