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」と表示される。



  • mscompressで圧縮された「a.txt_」を、LZCopy関数を用いて解凍する。

  •  まず、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