Ao verificar se um arquivo é MP3 está verificando a seqüência de nome de arquivo com um bom o suficiente .EndsWith?

StackOverflow https://stackoverflow.com/questions/1704550

  •  19-09-2019
  •  | 
  •  

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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top