关于LZ功能使用的不明确性

时间:2012-12-25 18:30:53

标签: c++ winapi compression lzw

注意:这个问题是关于Windows LZ函数的,File Management Functions以前缀LZ开头:LZOpenFile,LZCopy,LZClose等。如果Google没有错,这些可能是Windows API中记录最差的函数之一。

我正在试图找出哪种文件实际上适合与Windows LZ功能一起使用。 官方文档提到“使用Compress.exe压缩的数据”,但这些函数也能够处理未压缩的文件,在这种情况下不会应用解压缩。

现在,当我使用资源工具包中的compress.exe实用程序压缩文件时(使用-Z或-ZX开关),然后使用described here过程解压缩它,我得到的只是源文件不变,好像它没有按预期压缩。即使使用原始Windows XP安装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;
}

2 个答案:

答案 0 :(得分:3)

尝试没有选项的compress.exe here

除非您需要解压缩一些旧文件,否则请改用DotNetZip

答案 1 :(得分:2)

  

我正在试图找出实际适合哪种文件   用于Windows LZ功能。

您通常使用此文件的类型是您在软盘上分发的安装文件。在当天,微软的大多数产品都是从软盘安装的,大部分文件都经过压缩,以节省必须为每个客户分配的磁盘数量。

你通常可以告诉你在软盘上压缩了哪些文件,因为扩展名的最后一个字母通常是下划线:

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或您引用的函数解压缩它们。