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

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

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

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

1 ответ

Решение

Скорее всего, вы столкнетесь с тем, что 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.

Другие вопросы по тегам