Есть ли простой способ определить тип файла, не зная расширения файла? - PullRequest
7 голосов
/ 26 ноября 2008

У меня есть таблица с двоичным столбцом, в котором хранятся файлы с несколькими различными типами файлов (PDF, BMP, JPEG, WAV, MP3, DOC, MPEG, AVI и т. Д.), Но нет столбцов, в которых хранится имя или тип исходного файла. Есть ли какой-нибудь простой способ для меня обработать эти строки и определить тип каждого файла, хранящегося в двоичном столбце? Желательно, чтобы это была утилита, которая считывает только заголовки файлов, поэтому мне не нужно полностью извлекать каждый файл, чтобы определить его тип.

Уточнение : Я знаю, что подход здесь предполагает чтение только начала каждого файла. Я ищу хороший ресурс (он же ссылки), который может сделать это для меня без особой суеты. Спасибо.

Также, просто C # / .NET в Windows, пожалуйста . Я не использую Linux и не могу использовать Cygwin (не работает в Windows CE, среди прочих причин).

Ответы [ 7 ]

8 голосов
/ 26 ноября 2008

вы можете использовать эти инструменты, чтобы найти формат файла.

Анализатор файлов http://www.softpedia.com/get/Programming/Other-Programming-Files/File-Analyzer.shtml

Какой формат http://www.jozy.nl/whatfmt.html

Анализатор формата файлов PE http://peid.has.it/

Этот сайт может быть полезен для вас. http://mark0.net/onlinetrid.aspx

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

Пожалуйста, проверьте источник, прежде чем загружать их.

В прошлом я использовал инструмент, думаю, это File Analyzer, который подскажет вам наиболее близкое соответствие.

счастливый инструмент.

6 голосов
/ 26 ноября 2008

Это не полный ответ, но местом для начала будет библиотека "магических чисел". Это проверяет первые несколько байтов файла, чтобы определить «магическое число», которое сравнивается с известным списком из них. Это (по крайней мере часть) того, как работает команда file в системах Linux.

4 голосов
/ 26 ноября 2008

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

https://stackoverflow.com/questions/58510

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

http://software.topcoder.com/catalog/c_component.jsp?comp=13249160&ver=2

2 голосов
/ 26 ноября 2008

Самый простой способ, который я знаю, это использовать команду file , которая также доступна в Windows с Cygwin .

1 голос
/ 26 ноября 2008

Вам нужно использовать некоторый код взаимодействия p / invoke для вызова метода SHGetFileInfo из Win32 API. Эта статья также может помочь.

1 голос
/ 26 ноября 2008

Самый простой способ сделать это - получить доступ к системе * nix (или cygwin), которая имеет команду 'file':

$ file visitors.*
visitors.html: HTML document text
visitors.png:  PNG image data, 5360 x 2819, 8-bit colormap, non-interlaced

Вы могли бы написать приложение C #, которое передавало первые X байтов каждого двоичного столбца в команду файла (используя - в качестве имени файла)

1 голос
/ 26 ноября 2008

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

...