Ao verificar se um arquivo é MP3 está verificando a seqüência de nome de arquivo com um bom o suficiente .EndsWith?
Pergunta
Estou fazendo isso:
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.");
}
}
}
Existe uma melhor maneira de verificar os tipos de arquivos ou estou fazendo isso da maneira certa?
Solução
Tendo a extensão .mp3 não significa que é um mp3, mas não tendo isto é uma indicação (aceitável) que não é.
Em algum momento você vai chamar alguns API para reproduzir o arquivo, e vai falhar. Quando isso acontecer, você sabe que não é um arquivo jogável. Portanto, certifique-se de lidar com isso com alguma UI decente também.
Outras dicas
Sua pergunta parece perguntar se o caminho certo para verificar se um arquivo é MP3 é olhar para o final do nome do arquivo. Como já foi dito, a resposta para isso não é. O post de Matt Warren pode ajudá-lo se você quiser olhar para o arquivo para ver se ele é realmente formato mp3.
Mas o seu comentário sobre a resposta de Eran Betzalel me faz pensar se você está pedindo geralmente se o caminho certo para verificar a extensão do arquivo é usar String.EndsWith ().
Uma coisa a notar é que EndsWith (string) é sensível a maiúsculas, por isso os resultados de:
EndsWith("mp3")
EndsWith("Mp3")
EndsWith("MP3")
e
EndsWith("mP3")
Nem todos dão a mesma resposta. Um teste de melhor poderia ser:
if (Path.GetExtension(openFileDialog1.FileName).ToLower() == "mp3")
Se tudo o que importa é a extensão do arquivo e não o conteúdo do arquivo.
Se você realmente quer para analisar o arquivo (para verificar se ele realmente é um .mp3) você vai precisar de olhar para a especificação para que analisá-lo corretamente. Aqui é um bom lugar para começar e há mais algumas informações aqui . Este artigo na CodeProject vai ainda mais longe e extratos ID3 Tag bem como o cabeçalho.
Esta será melhor do que apenas a verificação de que a extensão é" .mp3" , mas é um monte de trabalho extra por isso tem que valer a pena.
Ela realmente depende da natureza do seu programa. Eu acho que se você é não desenvolvimento de uma aplicação relacionada com a segurança, então você pode usar a verificação simples extensão.
Não, porque extensão de arquivo é simplesmente um indicador, não é um guia confiável para o que o arquivo é ou contém.
Eu posso nomear arquivo de música i como mySong.zzz e ainda vai jogar em Winamp. Quando você carrega-lo você deve experimentar o início do arquivo para ver se ele realmente é um mp3.
Você também pode definir um filtro no seu diálogo de arquivo aberto para que ele só permite que o usuário selecione arquivos mp3:
openFileDialog1.Filter = "mp3|*.mp3|All Files|*.*";
Eu acho que a maneira correta para realmente verificar se ele é um arquivo MP3 (isto requer que o arquivo seja aberto) é procurar "números mágicos", seqüências de bytes dentro dos dados binários que sempre ocorrem. Neste caso, você pode usar número mágico da ID3 tag: tag ID3v1 são armazenados nos últimos 128 bytes do arquivo começando com os bytes "TAG" (hexadecimal "544147"), enquanto ID3v2 são armazenados no início do arquivo , de modo que os primeiros 3 bytes do arquivo são "ID3" (hexadecimal "494433"). Eu não sei se os próprios quadros de MP3 têm números mágicos simples como este. Obviamente, este método requer o arquivo a ser aberto, o que poderia fazer uma varredura de um grande número de arquivos mais lentas.
Se você quiser ter certeza, carregar o arquivo com este lib http://sourceforge.net/projects / id3dotnet / ele falhará com uma exceção se não um mp3. Basta criar um Id3.Net.Mp3File com nome de arquivo ou fluxo no construtor um ver se ele lança uma exceção