を介してファイルの変更についてプライマリドライブを監視する必要があるアプリケーションがありますReadDirectoryChangesW
。ただし、UACが有効になっている場合は、機能しません。
すべてのWindowsAPI呼び出しは成功しますが、変更は通知されません。
ルート内の各ディレクトリを個別に監視することでこれを回避できますが、ディレクトリが多すぎるとブルースクリーンが発生する可能性があるため、これは問題です。
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);
興味深いことに、.NETSystem.IO.FileSystemWatcher
は正しく機能し、私が使用しているものとまったく同じ関数とパラメーターを使用しますが、正しく動作します。