在 C# 中找出确切的文件类型
Find out exact file type in C#
如您所知,文件具有扩展名和 MIME 类型。
但是这两个属性不够智能,无法确定文件的确切类型。例如,我有一个 .exe
文件,我将其重命名为扩展名二 .png
。因此,如果我尝试以编程方式找出它的类型或 mime 类型,结果将是 images/png
或 .png
但我想读取文件的 header 并找出确切的文件类型。是否可以使用 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
等等
文件类型是否具有相似的起始十六进制格式?
您可以尝试检查文件中的某些文件签名或幻数。这是 known file signatures 列表的 link,似乎是最新的:
还有另一种方法可以做到这一点。使用 Winista MIME Detector.
有一个 XML 文件 mime-type.xml
包含有关文件类型和用于识别内容类型的签名的信息。您将需要此文件来创建 MimeTypes
对象的实例。创建 MimeTypes
对象后,调用 GetMimeType
方法获取流的 MimeType
。如果无法确定 MIME 类型,则此方法返回一个空对象。以下代码片段演示了该库的使用。
示例:
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);
如您所知,文件具有扩展名和 MIME 类型。
但是这两个属性不够智能,无法确定文件的确切类型。例如,我有一个 .exe
文件,我将其重命名为扩展名二 .png
。因此,如果我尝试以编程方式找出它的类型或 mime 类型,结果将是 images/png
或 .png
但我想读取文件的 header 并找出确切的文件类型。是否可以使用 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
等等
文件类型是否具有相似的起始十六进制格式?
您可以尝试检查文件中的某些文件签名或幻数。这是 known file signatures 列表的 link,似乎是最新的:
还有另一种方法可以做到这一点。使用 Winista MIME Detector.
有一个 XML 文件 mime-type.xml
包含有关文件类型和用于识别内容类型的签名的信息。您将需要此文件来创建 MimeTypes
对象的实例。创建 MimeTypes
对象后,调用 GetMimeType
方法获取流的 MimeType
。如果无法确定 MIME 类型,则此方法返回一个空对象。以下代码片段演示了该库的使用。
示例:
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);