Разъяснение API CAB-файла - PullRequest
       7

Разъяснение API CAB-файла

0 голосов
/ 26 августа 2011

Поскольку я нигде не вижу никакого контента, который бы не указывал на исходные документы Microsoft по этому вопросу, или на исходный код, который действительно не отвечает на мои вопросы, я подумал, что мог бы спросите несколько вещей здесь. (Тег Delphi есть, потому что это то, что моя среда разработки находится в коде, который я создаю из этого)

Тем не менее, у меня было несколько вопросов, на которые не отвечал документ API. Первый: fdi_notify messages. Что такое «моя ответственность» в кодировании этих: fdintCABINET_INFO: fdintPARTIAL_FILE: fdintNEXT_CABINET: fdintENUMERATE:? Я проиллюстрирую, что я имею в виду на примере. Для fdintCLOSE_FILE_INFO «моя ответственность» состоит в том, чтобы закрыть файл, связанный с данным мне дескриптором, и установить дату и время файла в соответствии с данными, переданными в fdi_notify.

Я полагаю, что мне чего-то не хватает, поскольку мой код не обрабатывает извлечение составных CAB-файлов ... есть мысли о том, как это сделать?

1 Ответ

6 голосов
/ 26 августа 2011

Скорее всего, вы столкнетесь с тем, что FDICopy читает только ту кабину, в которую вы проехали. Она будет использовать fdintNEXT_CABINET для получения составных данных для любых файлов, которые вы извлекаете в ответ на fdintCOPY_FILE , но он вызывает fdintCOPY_FILE только для файлов, которые запускаются в этой первой кабине.

Чтобы получить список каталогов для всего набора, вам нужно вызвать FDICopy в цикле. Каждый раз, когда вы получаете событие fdintCABINET_INFO, сохраняйте параметр psz1 (имя следующей кабины). Когда FDICopy вернется, проверьте это. Если это пустая строка, все готово, если нет, снова вызовите FDICopy со следующей кабиной в качестве нового пути.


fdintCABINET_INFO : единственная ответственность за это - возврат 0 для продолжения обработки. Вы можете использовать предоставленную информацию (путь к следующему шкафу, следующий диск, имя пути, идентификатор набора), но вам это не нужно.

fdintPARTIAL_FILE : В зависимости от того, как вы обрабатываете свои кабины, вы, вероятно, можете это игнорировать. Вы увидите его только для второго и более поздних изображений в наборе, и это говорит о том, что конкретная запись продолжается с предыдущей кабины. Если вы начали с первой кабины в наборе, вы уже видели fdintCOPY_FILE для файла. Если вы обрабатываете случайные файлы .cabs, вы тоже не сможете их использовать, поскольку у вас не будет начала извлечения файла.

fdintNEXT_CABINET : Вы можете использовать это, чтобы запросить у пользователя новый каталог для следующего кабинета, но для поддержки простого охвата просто верните 0, если переданное имя файла является действительным, или -1, если оно не ' т. Если вы вернете 0, а кабина будет неправильной или неправильной, вызов будет вызван снова. Самый простой подход (если вы не запрашиваете новый диск / каталог), это просто проверить pfdin^.fdie. Если это FDIError_None , то при первом вызове запрашиваемой кабины оно равняется, так что вы можете вернуть 0. Если что-то еще, то оно уже пыталось открыть запрошенную кабину хотя бы один раз, так что вы можете вернуть -1 как ошибка.

fdintENUMERATE : Я думаю, вы можете проигнорировать это. Он не описан в документации, и две библиотеки, которые я изучал, не используют его. Это может быть остаток от предыдущей версии API.

...