不知道文件扩展名的情况下,有没有一种简单的方法确定文件类型?

7
我有一个包含二进制列的表格,其中存储了多种可能的文件类型(PDF、BMP、JPEG、WAV、MP3、DOC、MPEG、AVI等),但没有存储原始文件名称或类型的列。是否有一种简单的方法可以处理这些行并确定存储在二进制列中的每个文件的类型?最好是只读取文件头的实用程序,以便我不必完全提取每个文件来确定其类型。
澄清:我知道这里的方法涉及仅读取每个文件的开头。我正在寻找一个可以为我完成此操作而不需要太多麻烦的良好资源(即链接)。谢谢。
另外,请只使用C#/.NET在Windows上进行操作。我不使用Linux,也无法使用Cygwin(在Windows CE上无法运行,等等原因)。
7个回答

8

您可以使用下列工具来查找文件格式。

文件分析器 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

注意: 我已经包含了下载链接,以确保您获取正确的工具名称和信息。

请在下载前验证来源。

我之前用过一个工具,我认为它是文件分析器,它会告诉您最接近的匹配结果。

祝您使用愉快。


谢谢提供链接。我会全部查看。 - MusiGenesis

6

这不是一个完整的答案,但一个起点可能是一个“魔法数字”库。它可以检查文件的前几个字节来确定一个“魔法数字”,并将其与已知列表进行比较。这就是Linux系统上file命令的工作方式(至少部分)。


如果你能给我指出一个像这样的好库,那对我来说就足够了。 - MusiGenesis
在Linux或Unix发行版中,可以查找/usr/share/file/magic、/etc/magic或其他类似位置。正如其他帖子所说,您也可以通过Cygwin获取此文件。 - ConcernedOfTunbridgeWells
1
-1 临时踩(我马上会撤掉)。我需要一个针对.NET的东西,有时候在像这样的问题中,1000个人会看到“文件”和“Linux”,并赞同一个答案,这会阻止其他人注意到其他答案。没有任何个人恩怨。 :) - MusiGenesis

4

有人问了类似的问题,并发布了用于完成此操作的代码。您应该能够采用此处发布的内容,并稍微修改它以使其从您的数据库中提取。

https://dev59.com/tXVD5IYBdhLWcg3wL4iM

此外,看起来有人基于魔术数字编写了一个库来完成此操作,但是该网站需要注册和某种替代访问才能下载此库。文档可以免费获取而无需注册,这可能有所帮助。

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


1
那个Topcoder的链接即使经过了一个荒谬的注册过程,也不允许下载 - 别靠近! - Brendan

3
我所知最简单的方法是使用file命令,它也可在Windows中使用Cygwin

1
很多文件类型都有明确定义的头部,用于标识文件的开头。你可以检查前几个字节来确定文件的开头。

1
你需要使用一些P/Invoke互操作代码来调用Win32 API中的SHGetFileInfo方法。这个文章也可能会有所帮助。

我认为这将返回服务器认为的文件类型(这可能是可以接受的),而我需要一种方法,无论在哪个服务器上运行,都能确定相同的文件类型。 - MusiGenesis
是的,它将返回服务器认为的文件类型。这与在Windows资源管理器中看到的“类型”列中的信息相同。在任何服务器上,唯一的方法就是编写自己的解析程序来查看文件扩展名、PE数据和文件头。 - Scott Dorman

1
最简单的方法是通过访问具有“file”命令的*nix(或cygwin)系统来完成此操作:
$ file visitors.*
visitors.html: HTML document text
visitors.png:  PNG image data, 5360 x 2819, 8-bit colormap, non-interlaced

你可以编写一个C#应用程序,将每个二进制列的前X个字节通过管道传输到文件命令(使用“-”作为文件名)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接