Как определить тип файла файла? - PullRequest
1 голос
/ 12 августа 2010

Как определить точный тип файла?Для лучшего понимания я приведу еще несколько деталей:

Например, если у меня есть файл с именем «example.exe», я могу легко распознать, что это исполняемый файл Windows (увидев расширение .exe).Но если я удаляю расширение (.exe), то, видя, что я не могу определить тип файла.

Тогда как мне определить тип файла?

(Пожалуйста, предложитеваши ответы, используя c / c ++, java, python или php (для загрузки в Интернет))

Спасибо

Ответы [ 5 ]

4 голосов
/ 12 августа 2010

Нет такой вещи как "точный тип файла". Двоичные данные - это двоичные данные.

Если вы работаете в POSIX-подобной системе, вы можете использовать команду file, чтобы угадать тип файла. Я не думаю, что это дает вам MIME тип.

Если на вашем сервере работает Apache, вы можете использовать mod_mime_magic, чтобы сделать предположение.

Если вы используете PHP, вы можете установить расширение fileinfo .

1 голос
/ 12 августа 2010

Вам необходимо знать спецификацию каждого типа файла, который вы хотите обработать.

С помощью этой спецификации вы можете создать метод для проверки того, относится ли данный файл к определенному типу.

Пример:

isExe(File)
isJpg(File)
0 голосов
/ 18 декабря 2017

Мы не можем распознать тип файла только по расширению.Можно легко изменить расширение файла с .text на .exe, что не означает, что файл является допустимым исполняемым файлом.

Допустим, мы находимся на платформе Windows:

Portable-Executable [PE] является родным форматом файла Win32.Каждый исполняемый файл использует формат PE-файла, кроме VxD и 16-битных DLL.32-битные dll, exe, COM-файлы, управление OCX, CPL-файлы, исполняемые файлы .NET, драйверы NT для режима ядра - все это в формате PE.Теперь «Перемещение дальше» формата PE имеет предопределенную структуру, состоящую из различных заголовков, заголовков разделов, данных разделов и т. Д., Которые содержат информацию об адресе, размере и исполняемом коде.

Заголовки содержат несколько файлов сигнатур:

например, исполняемые файлы всегда будут иметь значение MZ (0x5A4D) в заголовке DOS и значение PE (0x4550) в заголовке PE.

Из приведенных выше значений мы можем различать как исполняемые, так и неисполняемые файлы.

Теперьпереход к неисполняемому файлу:

Рассмотрим файл .jpg: мы используем различные инструменты для создания файла .jpg.При создании файла .jpg этот инструмент добавляет сигнатуру (что-то вроде 0xd8ff) в заголовочный файл и двоичные данные об изображении в разделе данных.при открытии файла .jpg программа считывает подпись в поле заголовка и, если найдена действительная подпись, рисует изображение на основе двоичных данных в разделе.

Аналогично, файлы .pdf, .mp3, ... будут иметь уникальные подписи.

.text файлы не будут иметь подписи.Данные будут доступны по первому смещению текстового файла.

Информация заголовка может быть просмотрена следующим образом:

CreateFile(...)//ReadMode
CreateFileMapping(...)
MapViewOfFile(...)

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

IMAGE_DOS_HEADER
IMAGE_NT_HEADER

Подпись должна сопоставляться с полем e_magic IMAGE_DOS_HEADER, а если это MZ (0x5A4D), то снова совпадать с полем Signature IMAGE_NT_HEADER.

0 голосов
/ 22 июня 2017

В случае Python: Волшебная библиотека Python предоставляет необходимую вам функциональность.

Вы можете установить библиотеку с помощью

pip install python-magic

и использовать ее какследует:

>>> import magic

>>> magic.from_file('sampleone.jpg') 
'JPEG image data, JFIF standard 1.01'

>>> magic.from_file('sampletwo.png') 
'PNG image data, 600 x 1000, 8-bit colormap, non-interlaced'
0 голосов
/ 12 августа 2010

Если вы хотите найти расширение файла, попробуйте использовать этот тривиальный код:

$ext = pathinfo($filename, PATHINFO_EXTENSION);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...