1

我正在这样做:

    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.");                        
            }
        }

    }

有没有更好的检查文件类型的方法,还是我做对了?

4

7 回答 7

4

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

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

于 2009-11-09T23:11:57.860 回答
3

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

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

需要注意的一件事是 EndsWith(string) 区分大小写,因此结果:

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

EndsWith("mP3")

不要都给出相同的答案。更好的测试可能是:

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

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

于 2009-11-09T23:39:14.670 回答
2

如果您真的想分析文件(以检查它是否真的是 .mp3),您需要查看规范以便正确解析它。是一个很好的起点,这里有更多信息这篇关于 CodeProject 的文章更进一步,提取了 ID3 标记以及标题。

这比仅仅检查扩展名是“.mp3”要好,但这是很多额外的工作,所以它必须是值得的。

于 2009-11-09T23:18:38.497 回答
1

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

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

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

openFileDialog1.Filter = "mp3|*.mp3|All Files|*.*";
于 2009-11-09T23:05:28.727 回答
1

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

于 2009-11-09T23:08:48.583 回答
0

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

于 2009-11-09T23:30:48.353 回答
0

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

于 2009-11-09T23:49:39.907 回答