Программно узнать тип файла, просмотрев его двоичное содержимое. Возможный? - PullRequest
6 голосов
/ 27 мая 2010

У меня есть компонент c #, который получит файл следующих типов .doc, .pdf, .xls, .rtf

Они будут отправлены вызывающим устаревшим приложением siebel в виде файлового потока.

Итак ...

[LegacyApp] >> {Поток двоичных файлов} >> [Компонент]

Устаревшее приложение представляет собой черный ящик, который нельзя изменить, чтобы сообщить компоненту, какой тип файла (doc, pdf, xls) он отправляет. Компонент должен прочитать этот двоичный поток и создать файл в файловой системе с правильным расширением.

Есть идеи?

Спасибо за ваше время.

Ответы [ 5 ]

7 голосов
/ 27 мая 2010

В системах на базе Linux / Unix вы можете использовать команду file, но я предполагаю, что вы хотите сделать это вручную в коде ...

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

Большинство программ / компонентов, которые делают то, что вам интересно, обычно читают первые несколько байтов и делают классификацию на основе этого. Например, файлы GIF начинаются с одного из следующих: GIF87a или GIF89a

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

Хорошее место для начала - зайти на www.wotsit.org . Он содержит спецификации формата файла с возможностью поиска по типу файла. Вы можете посмотреть на важные типы файлов, которые вы хотите обработать, и посмотреть, сможете ли вы найти какой-то определяющий фактор в этих форматах файлов.

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

2 голосов
/ 25 августа 2011

Да, это возможно, поскольку все файлы MS Office (97-2007 или около того) начинаются с D0CF11E, а затем в байте 512 есть маркер подтипа.

Ссылка на них находится по адресу: http://www.garykessler.net/library/file_sigs.html

Похоже, это лучший список со всеми видами форматов файлов - это основной справочник в Википедии.

Это не дает полной информации о новом формате Office, так что это из моих собственных примеров. Файлы DOCX начинаются с «PK» (так как технически они являются файлами zip) и затем содержат строку «word / _rels / document.xml.rels», в то время как XLSX содержат «xl / _rels / workbook.xml.rels».

1 голос
/ 27 мая 2010

Вас это может заинтересовать: http://en.wikipedia.org/wiki/Magic_number_(programming)

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

0 голосов
/ 27 мая 2010

Да. См. file.

И, пожалуйста, не изобретайте велосипед. Работает просто отлично, как есть.

0 голосов
/ 27 мая 2010

В linux есть команда с именем file. Получив произвольный файл, он пытается определить, что это за файл. Например:

gzip compressed data, from Unix, last modified: Fri Jun 12 20:16:28 2009
HTML document text
vCalendar calendar file
RCS/CVS diff output text

Это из нескольких случайных файлов, лежащих вокруг моего домашнего каталога.

...