#define pathDir "Z:\\"
DWORD WINAPI ThreadFunc(LPVOID lpParam)
{
HANDLE hDir = CreateFile(_T(pathDir), // pointer to the file name
FILE_LIST_DIRECTORY, // access (read/write) mode
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, // share mode
NULL, // security descriptor
OPEN_EXISTING, // how to create
FILE_FLAG_BACKUP_SEMANTICS, // file attributes (FILE_FLAG_OVERLAPPED)
NULL); // file with attributes to copy
const DWORD dwNotificationFlags = FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_FILE_NAME;
FILE_NOTIFY_INFORMATION Buffer[1024];
DWORD BytesReturned;
VOID *pBuf = (BYTE*)&Buffer;
while (ReadDirectoryChangesW(hDir, // handle to directory
&Buffer, // read results buffer
sizeof(Buffer), // length of buffer
TRUE, // monitoring option
dwNotificationFlags,
&BytesReturned, // bytes returned
NULL, // overlapped buffer
NULL)) // completion routine
{
FILE_NOTIFY_INFORMATION* pInfo = (FILE_NOTIFY_INFORMATION*) pBuf;
SelectAction(pInfo);
}
dwError = GetLastError();
CloseHandle(hDir);
return 0;
}
ReadDirectoryChangesW() работает с UNC-путями? Либо с сетевыми дисками?
Код:
GetLastError() выдает, что код ошибки
ERROR_INVALID_FUNCTION Incorrect function.
На MSDN ReadDirectoryChangesW Function есть такое:
Цитата:
Return Value
If the function fails, the return value is zero. To get extended error information, call GetLastError.
If the network redirector or the target file system does not support this operation, the function fails with ERROR_INVALID_FUNCTION.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
If the network redirector or the target file system does not support this operation, the function fails with ERROR_INVALID_FUNCTION.
В посте Нужен алгоритм пишут:
Цитата:
"Я проверял только на сетевом диске с NTFS. Там ReadDirectoryChangesW работал."
Как заставить работать ReadDirectoryChangesW()?
VS 2008
Upd: замечание по коду: учтите, что за один вызов ReadDirectoryChangesW() может вернуться не один буфер, вы должны пройтись по всей цепочке.
Код:
FILE_NOTIFY_INFORMATION *pInfo = (FILE_NOTIFY_INFORMATION *)pBuf;
while (pInfo) {
SelectAction(pInfo);
pInfo += pInfo->NextEntryOffset;
}
while (pInfo) {
SelectAction(pInfo);
pInfo += pInfo->NextEntryOffset;
}
Программу запускаю в WinXP SP3 (в VMware Player 3.1.4), в качестве сетевого диска "Z:" подключена расшаренная папка основной Windows XP SP3.
ФС - NTFS.
А вы уверены, что VMWare поддерживает обмен соответствующими уведомлениями? Такой вопрос еще: я так понимаю, вы подключали сетевой диск через стандартные VMWare'овские Shared Folders? Если да - попробуйте сэмулировать полноценный сетевой диск (т.е. назначить виртуалке IP-адрес и подключить сетевой диск, как для физической машины).
Гм. Кстати, да. Наблюдаю аналогичное поведение у MS Virtual PC -- уж куда роднее для ОС. Тем не менее, приходится нажимать Ctrl+R в FAR, чтобы увидеть изменения.
malor, попробуйте ради теста подключить какой-нибудь локальный диск как сетевой. И посмотрите, как ваш код будет работать.
Выставил Bridge в настройках сети в VMware и заработало.