在 C# 中找出确切的文件类型 [重复]

Posted

技术标签:

【中文标题】在 C# 中找出确切的文件类型 [重复]【英文标题】:Find out exact file type in C# [duplicate] 【发布时间】:2016-03-11 18:54:51 【问题描述】:

如您所知,文件具有扩展名和 mime 类型。 但是这两个属性不够智能,两个确定文件的确切类型。例如,我有一个.exe 文件,我将它的扩展名重命名为两个.png。因此,如果我尝试以编程方式找出它的类型或 mime 类型,结果将是 images/png.png 但我想读取文件头并找出确切的文件类型。是否可以使用 C# 语言以编程方式实现?

编辑

当然,有些问题与我的类似,但您知道文件以十六进制字符串开头,例如:

"JPEG", ".jpg", 0xFF, /*0xD*/ 0xD8, 0xFF, 0xE0, null, null, 0x4A, 0x46, 0x49, 0x46, 0x00

"Graphics Interchange Format 87a", ".gif", 0x47, 0x49, 0x46, 0x38, 0x37, 0x6

等等

文件类型是否有类似的起始十六进制格式?

【问题讨论】:

是的,但是您应该确切地知道任何现有文件中所谓的“标题”的内容是什么。 您可能需要限制问题的范围;如果你想测试 png 特别是有据可查的(这里的规范:w3.org/TR/PNG)所以你可以为此编写一个解析器。 你读过这个:***.com/questions/58510/…、***.com/questions/4177922/how-to-determine-file-type和***.com/questions/11547654/…吗? 您可以查看file type signatures. 可能是Guessing a file type based on its content 会是一个有趣的问题来看看 【参考方案1】:

您可以尝试检查文件中的某些文件签名或幻数。这是known file signatures 列表的链接,似乎是最新的:

还有另一种方法可以做到这一点。使用Winista MIME Detector。

有一个 XML 文件 mime-type.xml,其中包含有关文件类型和用于识别内容类型的签名的信息。您将需要此文件来创建 MimeTypes 对象的实例。一旦你创建了MimeTypes 对象,然后调用GetMimeType 方法来获取流的MimeType。如果无法确定 MIME 类型,则从此方法返回空对象。以下代码 sn -p 演示了该库的使用。

例子:

  MimeTypes g_MimeTypes = new MimeTypes("mime-types.xml");
    sbyte [] fileData = null;
    using (System.IO.FileStream srcFile = 
        new System.IO.FileStream(strFile, System.IO.FileMode.Open))
    
        byte [] data = new byte[srcFile.Length];
        srcFile.Read(data, 0, (Int32)srcFile.Length);
        fileData = Winista.Mime.SupportUtil.ToSByteArray(data);
    
    MimeType oMimeType = g_MimeTypes.GetMimeType(fileData);

【讨论】:

以上是关于在 C# 中找出确切的文件类型 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

我想知道 c# 中 ms access 数据库表列的确切数据类型(dbtype)

找出文件类型

输入类型文本字段值未返回确切文本

当您知道内容类型时如何获得正确的文件扩展名

c#代码来查找确切的日期差异,如vb [重复]

如何在c#中检查url是文件类型还是网页类型?