2012-12-03 10 views
6

Windowsの任意のプロセスでファイルが開かれているかどうかを検出する簡単な方法はありますか?ファイルがWindowsで開かれているかどうかをプログラムで検出するにはどうすればよいですか?

たとえば、私はディレクトリを監視しており、ファイルがディレクトリに置かれている場合、これらのファイルに対していくつかの処理を実行したいと考えています。

ファイルがまだディレクトリにコピーされている場合、またはこれらのファイルの内容がまだ更新されている場合、これらの操作は実行しません。

ファイル名を指定すると、IsFileOpenedAnywhereElseInAnyProcess(const PathName: string): Booleanなどの関数を実装して、trueまたはfalseのいずれかを返したいと考えています。

私は考えることができる方法の一つは、ファイルの名前を変更することで、名前の変更が成功した場合、他のプロセスがそうのように、私はに興味がファイルを開いていない:

function IsFileOpenedAnywhereElseInAnyProcess(const PathName: string): Boolean; 
begin 
    Result := not (MoveFileEx(PathName, PathName+'.BLAH', 0) and MoveFileEx(PathName+'.BLAH', PathName, 0)); 
end; 

ロジックファイルを(別の拡張子に)名前を変更して名前を変更することができれば、他のプロセス(チェック時には)で開くことはできません。

ありがとうございました。

+0

C++、C#を使用していますか? –

答えて

8
IsFileOpenedAnywhereElseInAnyProcess(const PathName: string): Boolean 

これは、マルチタスキングオペレーティングシステムで正しく実装できない機能です。あなたは誤ったリターンを得て、後に別のプロセスがファイルを開き、あなたの一日を破壊します。

これを正しく行う唯一の方法は、これを原子的に行い、実際にファイルを開こうとすることです。他のプロセスがファイルを開くことができないように共有を指定しないでください。別のプロセスが既にファイルにアクセスした場合、ERROR_SHARING_VIOLATIONで失敗します。あなたはしばらく待ってから、やり直してください。

+0

本当に良い答えハンスと私は後で= D – garfbradaz

+0

@ hans-passantのために保存します。 '_findfirst'関数を使用していますが、MSDNページでは隠しファイルと同じように共有については言及していません(例)[https://msdn.microsoft.com/en-us/library/kda16keh.aspx] –

+0

その関数はファイルを見つけるだけで、ファイルを開くことはありません。 CreateFileまたは_fsopenを使用します。 –

関連する問題