При проверке, является ли файл MP3, достаточно ли проверять строку имени файла с помощью .EndsWith?

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

  •  19-09-2019
  •  | 
  •  

Вопрос

Я делаю это:

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

    }

Есть ли лучший способ проверки типов файлов или я делаю это правильно?

Это было полезно?

Решение

Наличие расширения .mp3 не означает, что это mp3, но его отсутствие является (приемлемым) признаком того, что это не так.

В какой-то момент вы вызовете какой-нибудь API для воспроизведения файла, и это приведет к сбою.Когда это происходит, вы знаете, что это не воспроизводимый файл.Так что убедитесь, что вы справляетесь и с этим с помощью какого-нибудь приличного пользовательского интерфейса.

Другие советы

Ваш вопрос, похоже, спрашивает, правильный ли способ проверить, является ли файл MP3, - это посмотреть на конец имени файла.Как уже говорили другие, ответ на этот вопрос - нет.Сообщение Мэтта Уоррена может помочь вам, если вы хотите заглянуть в файл, чтобы увидеть, действительно ли это формат mp3.

Но ваш комментарий к ответу Эрана Бецалеля заставляет меня задуматься, спрашиваете ли вы вообще, правильный ли способ проверить расширение файла - использовать String.EndsWith() .

Следует обратить внимание на то, что EndsWith(строка) чувствителен к регистру, поэтому результаты:

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

и

EndsWith("mP3")

не все дают один и тот же ответ.Лучшим тестом могло бы быть:

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

если все, что вас волнует, - это расширение файла, а не содержимое файла.

Если вы действительно хотите проанализировать файл (чтобы проверить, действительно ли это формат mp3), вам нужно взглянуть на спецификацию, чтобы правильно ее проанализировать. Здесь это хорошее место для начала, и есть еще кое-какая информация здесь. Эта статья в CodeProject идет еще дальше и извлекает теги ID3, а также заголовок.

Это будет лучше, чем просто проверять, является ли расширение ".mp3", но это требует много дополнительной работы, так что это должно того стоить.

Это действительно зависит от характера вашей программы.Я думаю, что если вы не разрабатывая приложение, связанное с безопасностью, затем вы можете использовать простую проверку расширения.

Нет, поскольку расширение файла - это просто индикатор, оно не является надежным руководством к тому, чем является файл или что он содержит.

Я могу назвать свой музыкальный файл следующим образом Моя песня.zzz и он по-прежнему будет воспроизводиться в Winamp.Когда вы загружаете его, вы должны попробовать начало файла, чтобы увидеть, действительно ли это mp3.

Вы также можете установить фильтр в своем диалоговом окне "открыть файл", чтобы он позволял пользователю выбирать только файлы mp3:

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

Я предполагаю, что правильный способ на самом деле проверить, является ли это MP3-файлом (для этого требуется, чтобы файл был открыт), - это поиск "магических чисел", последовательностей байтов в двоичных данных, которые всегда встречаются.В этом случае вы можете использовать магический номер тега ID3:Теги ID3v1 хранятся в последних 128 байтах файла, начиная с байта "TAG" (шестнадцатеричный "544147"), в то время как теги ID3v2 хранятся в начале файла, поэтому первые 3 байта файла равны "ID3" (шестнадцатеричный "494433").Я не знаю, имеют ли сами MP3-фреймы простые магические числа, подобные этому.Очевидно, что этот метод требует открытия файла, что может замедлить сканирование большого количества файлов.

Если вы хотите быть уверены, загрузите файл с помощью этой библиотеки http://sourceforge.net/projects/id3dotnet/ это завершится неудачей с исключением, если это не mp3.Просто создайте Id3.Net.Mp3Файл с именем файла или stream в конструкторе и посмотрите, выдает ли он исключение

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top