2011-01-23 11 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が言ったように)と' Exception Handling'メソッド(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ファイル形式


のために働くの更新

ここでファイル名を取得するためのコードです:

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

クリップボードからファイル名を取得します(ファイルをクリップボードにコピーするだけで名前がコピーされます)。次に、ファイルがイメージであるかどうかを確認します。

ありそれを行うには、2つの方法があります。私は、ため、2番目のものを好む

一般的な画像フォーマットを示す

  1. が開き、ファイル
  2. ファイル拡張子によってと魔法のバイトをチェックしますたとえファイルの拡張子が間違っていても動作します。低速のメディアでは、クリップボードから取得したファイル名を処理するのではなく、ファイルにアクセスする必要があるため、処理が遅くなる可能性があります。

+0

私は正しい方向に向いてくれてありがとう。ファイル拡張子はここでは機能しないようです。私は魔法のバイトの事を理解しなければならないでしょう。 –

0

あなたが簡単にクリップボードを確認できますeまたは:

if (Clipboard.ContainsImage()) 
{ 
    MessageBox.Show("Yes this is an image."); 
} 
else 
{ 
    MessageBox.Show("No this is not an image!"); 
}