2011-01-23 3 views
6

Пользователь щелкает правой кнопкой мыши по файлу (скажем, на рабочем столе) и нажимает «копировать». Теперь, как определить в C#, если файл, скопированный в буфер обмена, является типом изображения?Определить, скопирован ли файл в буфер обмена

Clipboard.ContainsImage() не работает в этом случае

Ниже определяет, является ли изображение непосредственно копируется в буфер обмена, а не если файл копируется в буфер обмена

IDataObject d = Clipboard.GetDataObject(); 

    if(d.GetDataPresent(DataFormats.Bitmap)) 
    { 
     MessageBox.Show("image file found"); 
    } 

К быть ясным. Я хочу определить, является ли «файл», скопированный в буфер обмена, изображением.

Редактировать: ответы велики, но как мне получить имя файла, скопированного в буфер обмена? Clipboard.getText(), похоже, не работает. Edit2: Clipboard.GetFileDropList() works

+1

Во многих случаях проверки расширения файла достаточно. Однако вы можете использовать метод «Magic-Bytes» (как сказано в CodeInChaos) и «Метод обработки исключений» (как сказал Shekhar_Pro). Также есть инструмент под названием «TrID», который является бесплатной утилитой командной строки, которая может использоваться для определения типов файлов с использованием базы данных подписи. http://mark0.net/soft-trid-e.html – fardjad

ответ

6

Вы можете проверить его как это (нет встроенного способа сделать это) Прочтите файл и используйте его в объекте графического изображения, если он будет изображением, он будет работать в порядке, иначе он поднимет OutOfMemoryException.

здесь пример кода:

bool IsAnImage(string filename) 
    { 
    try 
    { 
     Image newImage = Image.FromFile(filename); 
    } 
    catch (OutOfMemoryException ex) 
    { 
     // Image.FromFile will throw this if file is invalid. 
     return false; 
    } 
    return true; 
    } 

Это будет работать для BMP, GIF, JPEG, PNG, форматы TIFF


Update

Вот код, чтобы получить FileName :

IDataObject d = Clipboard.GetDataObject(); 
if(d.GetDataPresent(DataFormats.FileDrop)) 
{ 
    //This line gets all the file paths that were selected in explorer 
    string[] files = d.GetData(DataFormats.FileDrop); 
    //Get the name of the file. This line only gets the first file name if many file were selected in explorer 
    string TheImageFile = files[0]; 
    //Use above method to check if file is Image file 
    if(IsAnImage(TheImageFile)) 
    { 
     //Process file if is an image 
    } 
    { 
     //Process file if not an image 
    } 
} 
+0

это прекрасно работает, за исключением того, что я не могу получить имя файла, скопированного в буфер обмена. любые идеи, как это получить? –

+0

Я обновил свой код .. –

3

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

Есть два способа сделать это:

  1. По расширению файла
  2. Открыть файл и проверьте магические байты с указанием общих форматов изображения

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

+0

спасибо, что указал мне в правильном направлении. По расширению файла, похоже, не работает здесь. Мне нужно будет разобраться в волшебном байте. –

0

Вы можете легко проверить буфер обмена, если содержит imag e или нет:

if (Clipboard.ContainsImage()) 
{ 
    MessageBox.Show("Yes this is an image."); 
} 
else 
{ 
    MessageBox.Show("No this is not an image!"); 
} 
Смежные вопросы