当检查文件是否是MP3正在检查文件名字符串时.EndsWith足够好吗?

时间:2009-11-09 23:01:42

标签: c# file-type

我这样做:

    private void LoadSoundFile()
    {
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            if (openFileDialog1.FileName.EndsWith(".mp3"))
            {
                txtFileName.Text = openFileDialog1.FileName;
            }
            else
            {
                MessageBox.Show("Currently Musicality only supports MP3 files.", "Unsupported file chosen.");                        
            }
        }

    }

有没有更好的方法来检查文件类型,或者我是以正确的方式做的吗?

7 个答案:

答案 0 :(得分:4)

拥有.mp3扩展名并不意味着它是一个mp3,但没有它是一个(可接受的)指示它不是。

在某些时候你会调用一些API来播放文件,但它会失败。当它发生时,你知道它不是一个可播放的文件。因此,请确保您使用一些不错的UI处理它。

答案 1 :(得分:3)

您的问题似乎在于询问检查文件是否为MP3的正确方法是查看文件名的结尾。正如其他人所说,答案是否定的。 Matt Warren的帖子可以帮助你,如果你想查看文件,看看它是否真的是mp3格式。

但是你对Eran Betzalel的回答的评论让我想知道你是否一般性地询问检查文件扩展名的正确方法是使用String.EndsWith()。

有一点需要注意的是,EndsWith(字符串)区分大小写,因此结果如下:

EndsWith("mp3")
EndsWith("Mp3")
EndsWith("MP3")

EndsWith("mP3")

并非所有人都给出相同的答案。更好的测试可能是:

if (Path.GetExtension(openFileDialog1.FileName).ToLower() == "mp3")

如果你关心的只是文件扩展名而不是文件内容。

答案 2 :(得分:2)

如果您确实想要分析文件(以检查它是否真的是.mp3),您需要查看规范,以便正确解析它。 Here是一个很好的起点,还有更多信息here。 CodeProject上的This article更进一步,提取ID3标签和标题。

这比检查扩展名为“.mp3”更好,但这是一项额外的工作,所以它必须值得。

答案 3 :(得分:1)

不,因为文件扩展名只是一个指标,它不是文件所包含或包含的可靠指南。

我可以将我的音乐文件命名为 mySong.zzz ,它仍会在Winamp中播放。当你加载它时,你应该采样文件的开头,看看它是否真的是一个mp3。

您还可以在打开的文件对话框中设置过滤器,以便它只允许用户选择mp3文件:

openFileDialog1.Filter = "mp3|*.mp3|All Files|*.*";

答案 4 :(得分:1)

这实际上取决于您的计划的性质。我认为,如果您开发安全相关的应用程序,那么您可以使用简单的扩展检查。

答案 5 :(得分:0)

我想实际检查它是否是MP3文件(这要求打开文件)的正确方法是查找“魔术数字”,二进制数据中始终出现的字节序列。在这种情况下,您可以使用ID3标记的幻数:ID3v1标记存储在文件的最后128个字节中,以字节“TAG”(十六进制“544147”)开头,而ID3v2标记存储在文件的开头,所以文件的前3个字节是“ID3”(十六进制“494433”)。我不知道MP3帧本身是否有像这样的简单幻数。显然,这种方法需要打开文件,这可能会使大量文件的扫描速度变慢。

答案 6 :(得分:0)

如果你想确定,使用这个lib http://sourceforge.net/projects/id3dotnet/加载文件,如果不是mp3,它将失败并出现异常。只需在构造函数中创建带有文件名或流的Id3.Net.Mp3File,看看它是否抛出异常