【问题标题】:Is there an easy way to determine the type of a file without knowing the file's extension?有没有一种简单的方法可以在不知道文件扩展名的情况下确定文件的类型?
【发布时间】:2008-11-25 21:11:05
【问题描述】:

我有一个带有二进制列的表,其中存储了许多不同可能文件类型(PDF、BMP、JPEG、WAV、MP3、DOC、MPEG、AVI 等)的文件,但没有列存储名称或原始文件的类型。我有什么简单的方法来处理这些行并确定存储在二进制列中的每个文件的类型吗?最好是一个只读取文件头的实用程序,这样我就不必完全提取每个文件来确定它的类型。

澄清:我知道这里的方法只是读取每个文件的开头。我正在寻找一个很好的资源(又名链接),它可以为我做到这一点而不会大惊小怪。谢谢。

另外,请仅在 Windows 上使用 C#/.NET。我没有使用 Linux,也无法使用 Cygwin(在 Windows CE 上无法使用,以及其他原因)。

【问题讨论】:

    标签: c# .net windows file-extension file-type


    【解决方案1】:

    您可以使用这些工具来查找文件格式。

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

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

    请在下载之前验证来源。

    我过去使用过一个工具,我认为它是文件分析器,它会告诉你最接近的匹配。

    快乐的工具。

    【讨论】:

    • 感谢您的链接。我要把它们都检查一遍。
    【解决方案2】:

    这不是一个完整的答案,但可以从“幻数”库开始。这将检查文件的前几个字节以确定“幻数”,并将其与已知的它们的列表进行比较。这(至少部分)是 Linux 系统上 file 命令的工作原理。

    【讨论】:

    • 如果你能指点我这样一个好的图书馆,这对我来说已经足够了。
    • 在 linux 或 unix 发行版上查找 /usr/share/file/magic、/etc/magic 或各种其他类似位置。正如另一张海报所说,你也可以用 cygwin 得到这个
    • -1 临时反对票(我稍后会删除它)。我需要一些 .NET 的东西,有时在像这样的问题上 1000 人会看到“文件”和“Linux”并投票支持一个阻止观众注意到其他人的答案。与个人无关。 :)
    【解决方案3】:

    其他人提出了类似的问题,并发布了用于执行此操作的代码。您应该能够获取此处发布的内容,并对其稍作修改,以便从您的数据库中提取。

    https://stackoverflow.com/questions/58510

    除此之外,似乎有人编写了一个基于幻数的库来执行此操作,但是,该站点似乎需要注册,并且需要某种形式的备用访问才能下载此库。该文档无需注册即可免费获得,这可能会有所帮助。

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

    【讨论】:

    • 即使经过荒谬的注册过程,该 topcoder 链接也不允许下载 - 不要靠近!
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      许多文件类型都有明确定义的文件开头的标题。您可以检查前几个字节以查看文件是如何开始的。

      【讨论】:

        【解决方案6】:

        最简单的方法是通过访问具有“文件”命令的 *nix(或 cygwin)系统:

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

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

        【讨论】:

          【解决方案7】:

          您需要使用一些 p/invoke 互操作代码从 Win32 API 调用 SHGetFileInfo 方法。这个article 也可能有帮助。

          【讨论】:

          • 我认为这将返回服务器认为的文件类型(这可能没问题),而我需要一种方法来确定相同的文件类型,无论它运行在什么服务器上。跨度>
          • 是的,它会返回服务器认为的文件类型。这与您在 Windows 资源管理器中为“类型”列看到的信息相同。在任何服务器上了解的唯一方法是编写自己的解析例程来查看文件扩展名、PE 数据和文件头。
          猜你喜欢
          • 1970-01-01
          • 2012-06-11
          • 2022-11-11
          • 1970-01-01
          • 2011-09-23
          • 2019-01-26
          • 2018-09-24
          • 1970-01-01
          • 2011-01-18
          相关资源
          最近更新 更多