Программно узнать тип файла, просматривая его двоичное содержимое. Возможно?

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

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

So...

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

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

Есть идеи?

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


person user20358    schedule 27.05.2010    source источник


Ответы (5)


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

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

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

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

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

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

person Brian R. Bondy    schedule 27.05.2010
comment
Если вы хотите обрабатывать в коде, да, ваши единственные варианты — это посмотреть на байты и выяснить, какой тип файла основан на этом. Большинство файлов имеют какой-то заголовок в первых нескольких байтах, описывающий данные, формат и т. д. - person Justin; 27.05.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

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

person retracile    schedule 27.05.2010
comment
Я работаю над компонентом .net, который будет развернут в среде Windows. - person user20358; 27.05.2010

Ага. См. file.

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

person amphetamachine    schedule 27.05.2010
comment
Конечно, именно этот руль работает под Linux. Не обычная платформа для таргетинга на С#. - person Jens; 27.05.2010
comment
@Jens - На самом деле это кроссплатформенный. Не та платформа, на которую ориентируется C#. - person amphetamachine; 27.05.2010
comment
Спасибо, Йенс, я искал что-то вроде подписи файла для каждого из тех типов, которые я упомянул. - person user20358; 27.05.2010