8

Windowsのいずれかのプロセスでファイルが開かれているかどうかを検出する簡単な方法はありますか?

たとえば、ディレクトリを監視していて、ファイルがディレクトリに配置されている場合、これらのファイルに対していくつかのアクションを実行したいとします。

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

したがって、何が起こっているのかというと、ファイル名が与えられた場合、またはのいずれかIsFileOpenedAnywhereElseInAnyProcess(const PathName: string): Booleanを返すfunctionなどの関数を実装したいと思います。truefalse

私が考えることができる方法の1つは、ファイルの名前を変更することです。名前の変更が成功した場合、次のように、他のプロセスが目的のファイルを開いていません。

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

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

ありがとう。

4

1 に答える 1

8
IsFileOpenedAnywhereElseInAnyProcess(const PathName: string): Boolean

これは、マルチタスク オペレーティング システムでは決して正しく実装できない機能です。False が返され、1 ナノ秒後に別のプロセスがファイルを開き、1 日が台無しになります。

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

于 2012-12-03T21:30:26.863 に答える