Подтвердить что ты не робот

Что такое хороший способ проверить файл, чтобы узнать, есть ли его zip файл?

Я ищу новую спецификацию формата файла, и в спецификации указано, что файл может быть либо основан на xml, либо zip файл, содержащий файл xml и другие файлы.

В обоих случаях расширение файла одинаково. Какие способы я могу проверить файл, чтобы решить, нужно ли ему распаковывать или просто читать?

4b9b3361

Ответ 1

Формат zip файла определяется PKWARE. Вы можете найти их спецификацию файла здесь.

В верхней части вы найдете спецификацию заголовка:

а. Локальный файл:

    local file header signature     4 bytes  (0x04034b50)
    version needed to extract       2 bytes
    general purpose bit flag        2 bytes
    compression method              2 bytes
    last mod file time              2 bytes
    last mod file date              2 bytes
    crc-32                          4 bytes
    compressed size                 4 bytes
    uncompressed size               4 bytes
    file name length                2 bytes
    extra field length              2 bytes

    file name (variable size)
    extra field (variable size)

Из этого вы можете видеть, что первые 4 байта заголовка должны быть сигнатурой файла, которая должна быть шестнадцатеричным значением 0x04034b50. Порядок байтов в файле - наоборот. PKWARE указывает, что "Все значения хранятся в порядке байтов младшего порядка, если не указано иное". Поэтому, если вы используете шестнадцатеричный редактор для просмотра файла, вы увидите 50 4b 03 04 as первые 4 байта.

Вы можете использовать это, чтобы проверить, является ли ваш файл zip файлом. Если вы откроете файл в блокноте, вы заметите, что первые два байта (50 и 4b) являются символами ASCII PK.

Ответ 3

Проверьте первые несколько байтов файла для магического номера. Файлы Zip начинаются с PK (50 4B). Поскольку XML файлы не могут начинаться с этих символов и по-прежнему действительны, вы можете быть достаточно уверены в типе файла.

Ответ 5

Вы можете использовать file, чтобы увидеть, есть ли он текстовый файл (xml) или исполняемый файл (zip). Прокрутите страницу вниз, чтобы увидеть пример.

Ответ 6

Нехорошее решение, но, просто подумав о загрузке... как насчет:

try
{
LoadXmlFile(theFile);//Exception if not an xml file
}
catch(Exception ex)
{
LoadZipFile(theFile)
}

Ответ 8

Вы можете попробовать разархивировать его - XML файл вряд ли будет действительным zip файлом или может проверить магические числа, как говорили другие.

Ответ 9

это зависит от того, что вы используете, но у zip-библиотеки может быть функция, которая проверяет файл или нет - это zip файл что-то вроде is_zip, test_file_zip или что-то еще...

или создайте свою собственную функцию, используя указанное магическое число.

Ответ 10

Просто проверьте, являются ли первые байты файла символами ASCII или нет. Если это так, то у вас есть XML, как обычный текстовый файл. Если нет - у вас есть сжатые данные.

Для более сложных ситуаций вам может потребоваться проверить Magic Number.