2010-11-14 40 views
5

我需要知道我的文件是否是音频文件:mp3,wav等...
如何做到这一点?如何确定文件类型?

+0

什么决定了你的文件类型,除了扩展名?并非每个文件都有指定其类型的元数据。 – 2010-11-14 14:42:14

+0

一个文件头,它决定一个文件类型。音频文件,视频文件,djvu文件等... – Sergey 2010-11-14 14:43:52

+3

简单的答案就是打开文件作为字节流,然后读取前20个字节。但是你应该小心,因为签名字节如何存储在文件头中没有真正的标准。您将不得不测试所有常见情况,或者提供一些可用的恒星文档。 – 2010-11-14 14:46:41

回答

0

您可以使用文件扩展名来弄明白:

using System.IO; 

class Program 
{ 
    static void Main() 
    { 
     string filepath = @"C:\Users\Sam\Documents\Test.txt"; 

     string extension = Path.GetExtension(filepath); 
     if (extension == ".mp3") 
     { 
      Console.WriteLine(extension); 
     } 
    } 
} 

的文件扩展名是呼叫的第一点,为OS找出文件类型它在处理,如果你真的想知道文件类型100%是唯一的方法来读取文件。但是,这带来了一个问题,图像文件很容易,因为它们以一种非常容易阅读的格式包含标题,但是它可以通过完全可变的文件类型变得更复杂一些。

您可以在旧帖子上查看this帖子以获得一些帮助。 Here是一篇关于寻找媒体文件类型的文章。

最终它取决于你为什么试图做到这一点。

+0

我可以根据需要更改扩展名,但我需要知道文件类型。 – Sergey 2010-11-14 14:41:36

-1
Path.GetExtension(PathToFile) 
+2

不,它会返回文件扩展名。但我需要知道文件类型 – Sergey 2010-11-14 14:39:43

0

this后。您最终将文件中的第一个(最多)256个字节的数据传递给FindMimeFromData(Urlmon.dll的一部分)。

2

虽然您可以使用扩展名来合理地猜测文件是什么,但它不能保证100%的工作时间。如果你的目标是Windows,那么它的工作时间为99.9%,因为这是Windows跟踪哪种文件是什么类型的。

如果您从非Windows来源获取文件,唯一可行的方法是打开文件并查找明确标识它的特定字符串或字节集。例如,您可以在mp3文件中查找ID3 tags

ID3v1标记占用128个字节,以字符串TAG开头。

ID3v2标签是大小可变的,通常出现在文件的开头,以帮助流媒体。

你走多远取决于你希望你的解决方案有多强大,并且依赖于总是存在的标题或模式。

这样做可以帮助防范恶意内容,其中有人发布恶意软件作为mp3文件(比如说),并希望它只会被一个易受某种漏洞攻击(缓冲区溢出)的程序运行。

+0

+1,指出文件扩展名是Windows如何确定文件类型(以及它应该打开哪个应用程序)。如果此方法中断,那么该文件很可能会“破坏”给用户,因为它们无法在Windows资源管理器中打开它。 Mac OS X用于处理这个问题的方式不同,但从10.6开始,它们将文件扩展名切换到黑暗的一面,作为用于将文件与其创建者关联的主要元数据。 – 2010-11-14 14:57:21

+1

@Cody - 关于Mac的有趣点,我认为他们使用了“unix”方法。 – ChrisF 2010-11-14 15:00:21

+0

实际上,与在嵌入资源分叉中嵌入类型代码和创建者代码之前的OS X中使用的分叉方法保持向后兼容相当复杂。在10.4版本中,Apple开始使用统一类型标识符,这是Windows世界中我们梦寐以求的东西。然而,直到10.6,如​​果一个文件存在,它仍然基于它的创建者代码打开,但是此行为已经被删除,并且所有文档(甚至那些具有旧版创建者代码的文档)都只使用文件扩展名。 – 2010-11-14 15:15:27

5

那么,最健壮的方法是为你想检测的文件类型编写一个解析器,然后试试 - 如果没有错误,显然是你尝试的类型。然而,这是一种昂贵的方法,但它可以确保您可以成功加载文件,因为它还会检查文件的其余部分是否具有语义完整性。

一个便宜得多的变体是查找“魔术”字节 - 在文件的开始或已知偏移量处签名。例如,如果文件以ID3标签开头,则可以合理确定它是MP3文件。如果一个文件以RIFF¼↕☻ WAVEfmt开头,那么它是一个WAV文件。但是,这种检测并不能保证你的文件真的是这种类型的 - 它可能只是签名和跟踪那些垃圾。

+0

如果他使用的lib/codec可以播放所有这些文件格式,会发生什么情况? – 2010-11-14 14:52:32