Замечания: этот вопрос о функциях Windows LZ, которые Функции управления файлами начиная с префикса LZ: LZOpenFile, LZCopy, LZClose и т. д. Если Google не ошибается, это, вероятно, одни из самых плохо документированных функций Windows API.
Я пытаюсь выяснить, какие файлы на самом деле подходят для использования с функциями Windows LZ.
В официальной документации упоминаются «данные, сжатые с помощью Compress.exe», но функции также могут обрабатывать несжатые файлы, и в этом случае декомпрессия не применяется.
Теперь, когда я сжимаю файл с помощью утилиты compress.exe из набора ресурсов (используя ключи -Z или -ZX), а затем распаковываю его, используя процедуру описано здесь, все, что я получаю, это исходный файл без изменений, как если бы он был сжат не так, как ожидалось. Даже с сжатым файлом с исходного установочного компакт-диска Windows XP (имена которого указаны в конце в папке 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;
}
Попробуйте compress.exe
Вот без вариантов.
Если вам не нужно распаковывать старые файлы, используйте DotNetZip вместо.
Я пытаюсь выяснить, какие файлы на самом деле подходят для
использование с функциями 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 или функции, на которые вы ссылаетесь.