问题描述
有没有一种方法可以用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不能打开它。