我有一个应用程序需要通过
所有的Windows API调用都成功了,但我没有收到任何更改通知。
我可以通过分别监视根目录下的每个目录来解决这个问题,但这是一个问题,因为如果有太多的目录,它可能会导致蓝屏。
有没有一种可接受的方法绕过UAC并在整个主要驱动器上接收文件更改通知?
相关的
有趣的是,.NET中的
ReadDirectoryChangesW
监视主要驱动器的文件变化。然而,当UAC启用时,它无法工作。所有的Windows API调用都成功了,但我没有收到任何更改通知。
我可以通过分别监视根目录下的每个目录来解决这个问题,但这是一个问题,因为如果有太多的目录,它可能会导致蓝屏。
有没有一种可接受的方法绕过UAC并在整个主要驱动器上接收文件更改通知?
相关的
CreateFile
和ReadDirectoryChangesW
如下。在不起作用的情况下,directory
是C:\。如果我监视任何辅助驱动器(例如E:\、F:\、G:\),它会按预期工作。没有任何调用返回错误。HANDLE fileHandle = CreateFileW(directory.c_str(), FILE_LIST_DIRECTORY,
FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL);
BOOL success = ReadDirectoryChangesW(fileHandle, watched.buffer.data(),
watched.buffer.size(), TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_LAST_WRITE,
NULL, &watched.overlapped, NULL);
有趣的是,.NET中的
System.IO.FileSystemWatcher
可以正确工作,并且它使用了和我使用的完全相同的函数和参数,但它表现正常。
ReadDirectoryChangesW
在系统内存中分配给定缓冲区的副本。 - Collin Dauphinee