1

有没有办法用 C++ 确定给定目录树中是否打开了任何文件?

Cmd.exe立即知道我是否尝试重命名文件夹并且该目录树中的文件当前处于打开状态。我使用 API Monitor 来确定 cmd.exe 使用NtOpenFile()后跟NtSetInformationFilewithFileRenameInformation并在文件打开时返回STATUS_ACCESS_DENIED,但我无法确定较低级别发生了什么。

我试图确保在开始批处理之前没有打开任何文件,而不必单独检查每个文件,因为目录树中可能有数十万个文件。

任何人都可以对此进行扩展吗?

谢谢,史蒂夫脱粒机。

4

1 回答 1

1

我认为您将不得不单独检查每个文件。也就是说,应该这样做:

HANDLE hFile = CreateFile
    (my_filename, GENERIC_READ, 0, 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 打开该文件。

于 2020-10-26T16:38:40.300 回答