FindFirstChangeNotification блокирует родительскую папку

Я использую FindFirstChangeNotification () / ReadDirectoryChangesW (), чтобы посмотреть папку на наличие изменений. Работает как положено. У меня такой вопрос: когда я пытаюсь переименовать родительский элемент в папке Watched, я получаю отказ в доступе, ошибка 5. Я предполагаю, что у моего дескриптора FCN есть папка, открытая для мониторинга уведомлений, и изменение родителя не разрешено.

Есть ли способ контролировать подкаталог, скажем, c: \ folder \ subfolder \ anotherfolder \, и при этом иметь возможность открывать командную строку (или другую программу) и выполнять «переименовать c: \ folder \ c: \ folder2»

вот мой фрагмент кода

    //
// Sign up for notifications on the object.
//
m_bWatchSubTree = TRUE;
m_dwWatchFlags =
FILE_NOTIFY_CHANGE_SECURITY |       // (0x100) change to security descriptor (NTFSACL?)
FILE_NOTIFY_CHANGE_CREATION |       // (0x40) change to creation date
FILE_NOTIFY_CHANGE_LAST_ACCESS |    // (0x20) change to last access date
FILE_NOTIFY_CHANGE_LAST_WRITE |     // (0x10) any change to the modification date/time of file in the folder
FILE_NOTIFY_CHANGE_SIZE |           // (0x08) Size changed
FILE_NOTIFY_CHANGE_ATTRIBUTES |     // (0x04) Atributes of something changed
FILE_NOTIFY_CHANGE_DIR_NAME |       // (0x02) DIR name change in watched folder rename,create,delete FOLDER
FILE_NOTIFY_CHANGE_FILE_NAME;       // (0x01) FILE name change in watched folder. rename,create,delete FILE

CString strObjectPathAndName(_T("c:\\folder\\subfolder\\anotherfolder\\");
m_hChangeHandle = ::FindFirstChangeNotification(strObjectPathAndName, m_bWatchSubTree, m_dwWatchFlags);
if (m_hChangeHandle != INVALID_HANDLE_VALUE)
{
DWORD dwStatus = ::WaitForSingleObject(m_hChangeHandle, INFINITE);
HANDLE  hDir = ::CreateFile(strObjectPathAndName,
FILE_LIST_DIRECTORY,
FILE_SHARE_READ | FILE_SHARE_WRITE| FILE_SHARE_DELETE,
NULL, //security attributes
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
NULL);
DWORD dwBytesReturned = 0;
FILE_NOTIFY_INFORMATION *p = (FILE_NOTIFY_INFORMATION*)nb.GetBuffer();
if (::ReadDirectoryChangesW(hDir, p, nb.GetMaxSize(), m_bWatchSubTree, m_dwWatchFlags, &dwBytesReturned, NULL, NULL))
{
//
// do some stuff
}
}

3

Решение

Не уверен, что это то, что тебе нужно,

Если вы заинтересованы в прослушивании ДРУГОГО пути при сохранении текущего слушателя в C: \ папка \ вложенная папка \ anotherfolder \, вам понадобится массив HANDLE типы.

В вашем коде это будет выглядеть так:

HANDLE m_hChangeHandle[x];// int x should be the quantity of your desired listeners.

Конечно, вам нужно использовать FindFirstChangeNotification для каждого вашего массива, то есть:

m_hChangeHandle[0] = FindFirstChangeNotification(..., ..., ...);
m_hChangeHandle[1] = FindFirstChangeNotification(..., ..., ...);
//and so on..

Поскольку вы используете более 1 слушателя, вы не можете продолжать использовать WaitForSingleObject скорее WaitForMultipleObjects. то есть:

WaitForMultipleObjects(x, m_hChangeHandle, FALSE, INFINITE);//False will wait for a change in at least one of the listeners.

Надеюсь, это то, что вам нужно.

0

Другие решения