2016-10-25 25 views
2

プログラム(ペイントなどの画像プログラム、メモ帳やワードパッドなどのテキストエディタなど)によってファイルが開かれ、内容がメモリにロードされてからファイルロックが解除されます。ロックされていなくてもプログラムがそのファイルを使用しているかどうかを確認する方法はありますか?ロックされていないファイルが開いていることを確認してください

例えば、image1.bmpがPaintで開いていても、ファイルがロックされていないため、私のプログラムはディスク上のimage1.bmpのコピーを上書きできます。これで、ペイントで開いているimage1.bmpのコピーは、ディスク上のimage1.bmpのコピーとは異なります。

私のプログラムはC#で書かれています。私は通常、ファイルがロックされているかどうかをチェックするためにこのメソッドを使用しますが、上記の場合は動作しません。 Is there a way to check if a file is in use?

これには解決策はありますか?

+1

の可能性のある重複http://stackoverflow.com/questions/876473/is-there-a-way-to-check-if-a-file:

私はこの質問からそれを適応しました-is-in-use – Jules

+0

私は上記のリンクを参照しました。その解決策は、ファイルがロックされている場合にのみ動作します – JohnRL

+0

ok、それは良いです – Jules

答えて

0

"今度はペイントで開いているimage1.bmpのコピー" - これはあなたの間違いです - このファイルはペイントで開いていません。それは開かれ、読まれてから閉じた。ペイントはファイルをまったく開いたままにしません。その内容はRAMメモリにのみコピーされます。別の言い方をすると、MSペイントで画像が見えるという事実は、そのファイルが開いていることを意味するものではありません。

文書を誰かに貸し出すのに匹敵します。その後、コピーを作成して返信します。文書を保持しなくても、別のコピーがあります。そして、文書を見るだけで、歴史のある時点で誰がそのコピーを作成したのか知る方法はありません。

それを置くことのもう一つの方法は、この疑似コードです:

File file = Open("image.png"); 
Image img = ImageFromFile(file); 
file.Close(); 

... 

img.Save("image.png"); 

ここでは何のファイルがコピーはその内容のRAMにだけあります、全く開かされていません。

注:実際には、ペイント - プロセスエクスプローラでハンドルを開いていることを確認できました。ペイントでファイルを開きましたが、その名前のファイルに対してハンドルが一切表示されませんでした。

0

これは私が思いついたものです。私は、ウィンドウタイトルのすべての開いているプロセスをチェックします。プロセスにウィンドウタイトルがある場合は、探しているファイルの名前が含まれているかどうかがわかります。

アプリケーションによっては、1つのインスタンスで複数のファイルを開くことができるため、100%の時間は実行されません。 Getting a list of all applications

 bool isFileOpen(string file) 
      {  
      string windowTitle = ""; 


      Process[] myProcesses = Process.GetProcesses(); 

      foreach (Process P in myProcesses) 
      { 
       if (P.MainWindowTitle.Length > 1) 
       { 
        windowTitle = P.MainWindowTitle; 
        if (windowTitle.Contains(file) == true) 
        { 
         return true;       
        }      
       } 

      } 
      return false; 

     } 
関連する問題