Win32API Compress.exeで圧縮されたファイルを解凍する LZCopy
Compress.exeは、16bitの時代にはよく使われていたようで、今となってはあまり使われていないかもしれないが、Compress.exeで圧縮されたファイルを解凍するプログラムを実装してみる。
Compress.exeとは、マイクロソフトから提供されているLZ77を使用した圧縮プログラムである。今回は、Compress.exeではなく、「MsCompress」というCompress.exe互換のプログラムを使って、ファイルを圧縮してみる。MsCompressは、以下のURLからダウンロードし入手できる。
http://gnuwin32.sourceforge.net/packages/mscompress.htm
まず、MsCompressのサイトにアクセスすると以下のようなページが表示される。
次に、「Download」のところの「Binaries」の「Zip」からMsCompressのバイナリをダウンロードする。
ダウンロードされたファイルは、「mscompress-0.3-bin.zip」という名前である(これは今後変わる可能性がある)。
「mscompress-0.3-bin.zip」を解凍すると「mscompress-0.3-bin」ディレクトリが生成され、そのディレクトリの下に、以下のようなディレクトリ構成ができる。
「bin」ディレクトリの中に、「mscompress.exe」が存在する。
「man/cat1」ディレクトリに「mscompress.1.txt」というファイルがあり、これにmscompress.exeの使用方法が書かれている。使用方法を調べてみる。以下に「mscompress.1.txt」から使用方法の部分を引用する。
MSCOMPRESS(1) MSCOMPRESS(1) NAME mscompress - compress data using LZ77 algorithm SYNOPSIS mscompress [ -h ] mscompress [ -V ] mscompress [ name ... ]
この文書によれば、コマンドプロンプトで、「mscompress -h」を実行すれば、ヘルプが得られるようだ。
C:\mscompress-0.3-bin\bin>mscompress.exe -h Usage: mscompress.exe [-h] [-V] [file ...] -h --help give this help -V --version display version number file... files to compress. Report bugs to <mhi@penguin.cz>
また、「mscompress -V」を実行すれば、mscompressのバージョン情報が得られる。
C:\mscompress-0.3-bin\bin>mscompress.exe -V mscompress version 0.3 (gamma) Mar 14 2004
そして、「mscompress ファイル名」を実行すればファイルを圧縮できる。圧縮されたファイルのファイル名は、ファイル名の末尾にアンダスコアが付く。例えば、「a.txt」というファイルをmscompressで圧縮した場合は、圧縮されたファイルのファイル名は「a.txt_」という名前になる。
C:\mscompress-0.3-bin\bin>mscompress.exe a.txt
mscompressコマンドでファイルの圧縮が成功した場合は、プロンプトには何も表示されないようだ。失敗した場合は、「【ファイル名】: No such file or directory」と表示される。
まず、LZOpenFile関数で、圧縮されたファイル「a.txt_」と解凍後のファイル「b.txt」をオープンし、それぞれのファイルハンドル(INT型)を取得する。
次にLZCopy関数の引数に取得したファイルハンドルを指定して呼び出す。このLZCopy関数が成功すれば、ファイルは解凍される。
最後にLZClose関数で、それぞれのファイルハンドルをクローズする。
ファイルを解凍するプログラムの例を以下に示す。
プログラムは、「lzexpand.h」をインクルードし、「lz32.lib」をリンクする必要がある。
#include <windows.h> #include <lzexpand.h> #pragma comment(lib, "lz32.lib") int main() { char *source = "a.txt_";//mscompress.exeで圧縮されたファイルの名前 char *destination = "b.txt";//解凍後のファイル名 OFSTRUCT ofstruct; INT hSource = LZOpenFile(source, &ofstruct, OF_READ); INT hDest = LZOpenFile(destination, &ofstruct, OF_CREATE); LZCopy(hSource, hDest);//ファイル「a.txt_」を解凍する。 LZClose(hSource); LZClose(hDest); return 0; }
このプログラムを実行すると、「a.txt_」が解凍され、その結果「b.txt」が生成される。「b.txt」は、圧縮前の「a.txt」と内容が全く同じファイルとなっている。
参考
http://msdn.microsoft.com/ja-jp/library/cc429604.aspx LZOpenFile
http://msdn.microsoft.com/ja-jp/library/cc429593.aspx LZCopy
http://msdn.microsoft.com/ja-jp/library/cc429590.aspx LZClose
http://gnuwin32.sourceforge.net/packages/mscompress.htm MsCompress