7

注:この質問は、プレフィックスLZで始まるファイル管理関数であるWindows LZ関数に関するものです:LZOpenFile、LZCopy、LZCloseなど。Googleが間違っていない場合、これらはおそらくWindowsAPIの最も文書化されていない関数の1つです。 。

WindowsのLZ関数での使用に実際に適しているファイルの種類を見つけようとしています。公式ドキュメントには「Compress.exeを使用して圧縮されたデータ」と記載されていますが、関数は非圧縮ファイルも処理できます。この場合、解凍は適用されません。

ここで、リソースキットのcompress.exeユーティリティを使用してファイルを圧縮し(-Zまたは-ZXスイッチのいずれかを使用)、ここで説明する手順を使用して解凍すると、ソースファイルは変更されていないかのようになります。期待どおりに圧縮されませんでした。元のWindowsXPセットアップCD(i386フォルダの最後にアンダースコアが付いた名前のファイル)の圧縮ファイルを使用しても、同じ結果が得られます。結論:どのファイルを解凍しようとしても、変更せずに元に戻します。

私が使用しているコードは非常に単純で、基本的にはMSDNの記事で説明されている手順を再現しているため、バグがある場合は別の場所にあるはずです。しかし、私はまだ間違った入力ファイルを使用していると思う傾向があります。誰かがすでにそれらのLZ機能の経験がありますか?これがC++での私のコードです。

#include <iostream>
#include <Windows.h>

using namespace std;

int main(int argc, char ** argv) {
    OFSTRUCT ofs1, ofs2;
    INT hfSrc = -1, hfDest = -1;

    if (argc <= 2) {
        cerr << "Usage: LZTEST Source Destination";
        return 1;
    }
    __try {
        hfSrc = LZOpenFile(argv[1], &ofs1, OF_READ);
        if (hfSrc < 0) {
            cerr << "Error invoking LZOpenFile on source file: " << hfSrc;
            return 1;
        }
        hfDest = LZOpenFile(argv[2], &ofs2, OF_CREATE);
        if (hfDest < 0) {
            cerr << "Error invoking LZOpenFile on destination file: " << hfDest;
            return 1;
        }
        INT result = LZCopy(hfSrc, hfDest);
        if (result < 0) {
            cerr << "Error invoking LZCopy: " << result;
            return 1;
        }
    } __finally {
        if (hfSrc >= 0) LZClose(hfSrc);
        if (hfDest >= 0) LZClose(hfDest);
    }
    cout << "Success";
    return 0;
}
4

2 に答える 2

3

オプションなしでcompress.exe ここを試してください。

古いファイルを解凍する必要がない限り、代わりにDotNetZipを使用してください。

于 2012-12-30T23:14:27.337 に答える
2

WindowsのLZ関数での使用に実際に適しているファイルの種類を見つけようとしています。

これを通常使用するファイルの種類は、フロッピーディスクで配布するインストールファイルでした。当時、Microsoftの製品のほとんどはフロッピーディスクからインストールされ、ほとんどのファイルは、顧客ごとに配布する必要のあるディスクの数を節約するために圧縮されていました。

拡張子の最後の文字は通常アンダースコアであるため、一般的にフロッピーディスクで圧縮されたファイルを知ることができます。

KEYBOARD.DR_
KEYVIEW.EX_
LANGDUT.DL_
LANGENG.DL_
LANGFRN.DL_
LANGGER.DL_
LANGSCA.DL_
LANGSPA.DL_
LMOUSE.CO_
LMOUSE.DR_
LVMD.38_
LZEXPAND.DL_
MMSOUND.DR_
MOUSE.DR_
MSC3BC2.DR_
MSCMOUSE.DR_

EXPAND.EXEまたは参照する関数を使用して、それらを解凍できます。

于 2013-01-04T21:28:52.353 に答える