Проверка типа файла в VB.NET? - PullRequest
       29

Проверка типа файла в VB.NET?

3 голосов
/ 24 августа 2010

У меня есть программа с измененным размером изображения, и она работает.Проблема в том, что когда пользователь выбирает файл, не являющийся изображением, в диалоговом окне выбора файла, происходит сбой.Как я могу проверить наличие файлов изображений?

Ответы [ 5 ]

7 голосов
/ 24 августа 2010

Вот VB.NET-эквивалент ответа 0xA3 , поскольку ОП настаивал на версии VB.

Function IsValidImage(filename As String) As Boolean
    Try
        Dim img As System.Drawing.Image = System.Drawing.Image.FromFile(filename)
    Catch generatedExceptionName As OutOfMemoryException
        ' Image.FromFile throws an OutOfMemoryException  
        ' if the file does not have a valid image format or 
        ' GDI+ does not support the pixel format of the file. 
        ' 
        Return False
    End Try
    Return True
End Function

Вы используете его следующим образом:

If IsValidImage("c:\path\to\your\file.ext") Then
    'do something
    '
Else
    'do something else
    '
End If

Edit:
Я не рекомендую вам проверять расширения файлов. Любой может сохранить другой файл (например, текстовый документ) с расширением .jpg и заставить ваше приложение заставить его поверить, что это изображение.

Лучший способ - загрузить изображение с помощью функции, описанной выше, или открыть первые несколько байтов и проверить наличие подписи JPEG.



Вы можете найти больше информации о файлах JPEG и их заголовках здесь:

5 голосов
/ 24 августа 2010

Очень примитивная проверка - просто попытаться загрузить изображение.Если он недействителен, будет выдано OutOfMemoryException:

static bool IsImageValid(string filename)
{
    try
    {
        System.Drawing.Image img = System.Drawing.Image.FromFile(filename);
    }
    catch (OutOfMemoryException)
    {
        // Image.FromFile throws an OutOfMemoryException 
        // if the file does not have a valid image format or
        // GDI+ does not support the pixel format of the file.
        //
        return false;
    }
    return true;
}

Если я правильно понял ваш вопрос, ваше приложение все равно загрузит изображение.Поэтому простое завершение операции загрузки в блок try / catch не означает никаких дополнительных затрат.Для решения VB.NET этого подхода проверьте ответ @Alex Essilfie.

Те, кому интересно, почему Image.FromFile создает OOM для недопустимых файлов, должны прочитать ответ Hans Passant на следующий вопрос:

Существует ли причина, по которой Image.FromFile создает исключение OutOfMemoryException для недопустимого формата изображения?

3 голосов
/ 24 августа 2010

Конечно, вашей первой линией защиты будет просто проверить расширение файла:

Function IsImageFile(ByVal filename As String) As Boolean
    Dim ext As String = Path.GetExtension(filename).ToLowerInvariant()

    ' This supposes your program can deal only with JPG files; '
    ' you could add other extensions here as necessary. '
    Return ext = ".jpg" OrElse ext = ".jpeg"
End Function

Еще лучше, как SLC предлагает в комментарии, установить свойство Filter вашего диалога:

dialog.Filter = "Image files|*.jpg;*.jpeg"

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

2 голосов
/ 09 апреля 2013

Ответы на VB и C # великолепны, но также содержат «гочу», если вы планируете изменить или переместить файл: созданный объект «img» заблокирует файл изображения, если не вызывается метод dispose () для его освобождения.Смотрите ниже:

VB
    Function IsValidImage(filename As String) As Boolean
    Try
        Dim img As System.Drawing.Image = System.Drawing.Image.FromFile(filename)
        img.dispose()  ' Removes file-lock of IIS
    Catch generatedExceptionName As OutOfMemoryException
        ' Image.FromFile throws an OutOfMemoryException  
        ' if the file does not have a valid image format or 
        ' GDI+ does not support the pixel format of the file. 
        ' 
        Return False
    End Try
    Return True
End Function

C#
static bool IsImageValid(string filename)
{
    try
    {
        System.Drawing.Image img = System.Drawing.Image.FromFile(filename);
        img.dispose();   // Removes file-lock of IIS
    }
    catch (OutOfMemoryException)
    {
        // Image.FromFile throws an OutOfMemoryException 
        // if the file does not have a valid image format or
        // GDI+ does not support the pixel format of the file.
        //
        return false;
    }
    return true;
}
0 голосов
/ 24 августа 2010

Самый надежный способ - это понять сигнатуры файлов, которые нужно загрузить.

Например, JPEG имеет определенный формат заголовка.

Таким образом, ваш код не будетбыть легко обманутым, если вы просто посмотрите на расширение. Ответ

163 поможет вам проделать большую часть пути в этом направлении.

...