通过查看其二进制内容以编程方式找出文件类型。可能?

时间:2010-05-27 13:45:52

标签: c# filestream file-type

我有一个c#组件,它将收到以下类型的文件 .doc,.pdf,.xls,.rtf

这些将由调用siebel传统应用程序作为文件流发送。

因此...

[LegacyApp]>> {二进制文件流}>> [成分]

遗留应用程序是一个黑盒子,无法修改以告诉组件它发送的文件类型(doc,pdf,xls)。组件需要读取此二进制流并在具有正确扩展名的文件系统上创建文件。

有什么想法吗?

感谢您的时间。

5 个答案:

答案 0 :(得分:7)

在基于Linux / Unix的系统上,您可以使用file命令,但我假设您想在代码中自己手动执行此操作...

如果你有权访问的是文件的字节流,那么你需要独立处理每种文件类型。

执行您想知道的大多数程序/组件通常会读取前几个字节并根据它进行分类。例如,GIF文件以下列之一开头:GIF87a或GIF89a

许多文件格式在文件开头具有相同的签名,或者具有相同的标头格式。此签名称为magic number as described by me on this post

入门的好地方是去www.wotsit.org。它包含可按文件类型搜索的文件格式规范。您可以查看要处理的重要文件类型,看看是否可以在这些文件格式中找到一些识别因素。

您还可以搜索Google以尝试查找执行此分类的库,或查看文件命令的源代码。

答案 1 :(得分:2)

是的,这是可能的,因为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”。

答案 2 :(得分:1)

您可能对此感兴趣:http://en.wikipedia.org/wiki/Magic_number_(programming)

大多数二进制格式在开头都包含一个幻数。如果您只需要识别某组格式,则应该很容易检查新传入文件的前几个字节并正确猜出相应的文件扩展名。

答案 3 :(得分:0)

在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

这些来自我家主目录中的几个随机文件。

答案 4 :(得分:0)

是的。请参阅file

请不要重新发明轮子。它的工作原理很好。