Я не хочу полагаться на расширение файла.Мне все равно, какой тип изображения (.jpg, .png и т. Д.), Я просто хочу знать, является ли файл изображением или нет.Я предпочел бы не использовать никакие не .NET библиотеки, если это возможно.
Лучший способ, которым я знаю, как это сделать, это следующее:
bool isImageFile;
try
{
Image.FromFile(imageFile).Dispose();
isImageFile = true;
}
catch (OutOfMemoryException)
{
isImageFile = false;
}
Как отмечено здесь: http://msdn.microsoft.com/en-us/library/stf701f5.aspx, Image.FromFile()
выдает OutOfMemoryException
, если файл не является допустимым форматом изображения.Использование вышеуказанного дает мне именно тот результат, который я хочу , однако я бы предпочел не использовать его по следующим причинам:
- Я считаю, что использование try-catches длянормальное выполнение программы является плохой практикой по соображениям производительности.
Image.FromFile()
загружает весь файл изображения (если это файл изображения) в память.Я полагаю, это расточительно, потому что мне нужен только тип файла, и мне не нужно больше манипулировать изображениями на этом этапе в моем коде. - Я не люблю перехватывать
OutOfMemoryException
с, потому что, если существует РЕАЛЬНОЕпроблема нехватки памяти, и моя программа глотает ее и продолжает работать?
Есть ли более эффективные способы сделать это? Или, есть какие-либо / все моипроблемы, перечисленные выше, необоснованны?
Редактировать: С момента получения ответов здесь, это три решения Теперь я знаю:
- Загрузка всего изображения в память с помощью
Image.FromFile()
и try-catch. - Плюсы : Проводит более глубокую проверку содержимого файлов изображений;охватывает много типов изображений.
- Минусы : медленный;накладные расходы от try-catch и загрузки полного файла изображения в память;потенциальная опасность от перехвата «настоящего» исключения OutOfMemoryException.
- Проверьте байты заголовка файла изображения.
- Плюсы : Быстрое использование памяти.
- Минусы : потенциально хрупкие;необходимо программировать для каждого типа файла.
- Проверьте расширение файла.
- Плюсы : Самый быстрый;самое простое.
- Минусы : Не работает во всех ситуациях;проще всего ошибиться.
(Я не вижу явного "победителя", поскольку могу представить себе ситуацию, в которой каждый из них будет уместен. Для целей моего приложения файлпроверка типов происходит достаточно редко, поэтому проблемы с производительностью метода 1 не были проблемой.)