有没有一种简单的方法来检测是否在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;
逻辑是如果我可以重命名文件(到另一个扩展名)然后重新命名它,它不被任何其他进程打开(在检查时)。
谢谢。
IsFileOpenedAnywhereElseInAnyProcess(const PathName: string): Boolean
这是一个在多任务操作系统上永远无法正确实现的功能。 你会得到一个虚假的回报,一个纳秒后,另一个进程打开文件,并毁了你的一天。
正确地做到这一点的唯一方法就是自动执行此操作,实际上试图打开文件。 并指定不共享,以便其他进程也可以打开该文件。 如果另一个进程已经获得对该文件的访问权限,那么将会失败并返回ERROR_SHARING_VIOLATION。 在哪一刻你会有一段时间的等待,稍后再试。