Что такое хороший способ проверить файл, чтобы узнать, есть ли его zip файл?
Я ищу новую спецификацию формата файла, и в спецификации указано, что файл может быть либо основан на xml, либо zip файл, содержащий файл xml и другие файлы.
В обоих случаях расширение файла одинаково. Какие способы я могу проверить файл, чтобы решить, нужно ли ему распаковывать или просто читать?
Ответы
Ответ 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.
Ответ 2
Вы можете посмотреть магическое число файла. Те, что для ZIP-архивов, перечислены на странице в формате wikipedia: PK\003\004 or PK\005\006
.
Ответ 3
Проверьте первые несколько байтов файла для магического номера. Файлы Zip начинаются с PK (50 4B). Поскольку XML файлы не могут начинаться с этих символов и по-прежнему действительны, вы можете быть достаточно уверены в типе файла.
Ответ 4
Магические номера файлов
Чтобы уточнить, он начинается с 50 4b 03 04.
См. http://www.pkware.com/documents/casestudies/APPNOTE.TXT (Из Саймона П Стивенса)
Ответ 5
Вы можете использовать file, чтобы увидеть, есть ли он текстовый файл (xml) или исполняемый файл (zip).
Прокрутите страницу вниз, чтобы увидеть пример.
Ответ 6
Нехорошее решение, но, просто подумав о загрузке... как насчет:
try
{
LoadXmlFile(theFile);//Exception if not an xml file
}
catch(Exception ex)
{
LoadZipFile(theFile)
}
Ответ 7
Вы можете проверить файл, чтобы увидеть, содержит ли он правильный XML-заголовок. Если это не так, попробуйте распаковать его.
См. Щелкните здесь для спецификации XML.
Ответ 8
Вы можете попробовать разархивировать его - XML файл вряд ли будет действительным zip файлом или может проверить магические числа, как говорили другие.
Ответ 9
это зависит от того, что вы используете, но у zip-библиотеки может быть функция, которая проверяет файл или нет - это zip файл
что-то вроде is_zip, test_file_zip или что-то еще...
или создайте свою собственную функцию, используя указанное магическое число.
Ответ 10
Просто проверьте, являются ли первые байты файла символами ASCII или нет. Если это так, то у вас есть XML, как обычный текстовый файл. Если нет - у вас есть сжатые данные.
Для более сложных ситуаций вам может потребоваться проверить Magic Number.