检查给定目录树中的打开文件

问题描述

有没有一种方法可以用C +++确定在给定的目录树中是否打开了任何文件

Cmd.exe立即知道我是否尝试重命名文件夹,并且该目录树中的文件当前处于打开状态。我已经使用API​​ Monitor确定cmd.exe使用NtOpenFile(),然后使用NtSet@R_769_4045@ionFile和FileRename@R_769_4045@ion,并在打开文件时返回STATUS_ACCESS_DENIED,但我无法确定较低级别的情况。我试图确保在开始批处理之前没有打开任何文件,而不必单独检查每个文件,因为目录树中可能有成千上万个文件

有人可以对此进行扩展吗?

谢谢, 史蒂夫·脱粒机。

解决方法

我认为,您将必须分别检查每个文件。也就是说,应该这样做:

HANDLE hFile = CreateFile
    (my_filename,GENERIC_READ,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if (hFile == INVALID_HANDLE_VALUE)
{
    DWORD err = GetLastError ();
    if (err == ERROR_SHARING_VIOLATION)
    {
        // File is already open
    }
}
else
    CloseHandle (hFile);

请注意,dwShareMode作为0进行传递,如果文件已经在其他位置打开,则Windows不能打开它。