7

注意:这个问题是关于 Windows LZ 函数的,它们是以前缀 LZ 开头的文件管理函数:LZOpenFile、LZCopy、LZClose 等。如果 Google 没有错,这些可能是 Windows API 中文档记录最差的函数之一.

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

现在,当我使用资源工具包中的 compress.exe 实用程序压缩文件(使用 -Z 或 -ZX 开关),然后使用此处描述的过程对其进行解压缩时,我得到的只是源文件未更改,就好像它没有按预期压缩。即使使用原始 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;
}
4

2 回答 2

3

尝试compress.exe 这里没有选项。

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

于 2012-12-30T23:14:27.337 回答
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 或您引用的函数解压缩它们。

于 2013-01-04T21:28:52.353 回答