Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ReadDirectoryChangesW() работает с UNC-путями? Либо с сетевыми дисками?

7.4K
08 августа 2011 года
malor
69 / / 20.01.2007
В коде функция ReadDirectoryChangesW() возвращает ноль:
Код:
#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;
}

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.


В посте Нужен алгоритм пишут:

Цитата:
"Я проверял только на сетевом диске с NTFS. Там ReadDirectoryChangesW работал."



Как заставить работать ReadDirectoryChangesW()?

VS 2008

278
08 августа 2011 года
Alexander92
1.1K / / 04.08.2008
С сетевыми дисками - 100% работает (разумеется, если удаленная файловая система поддерживает соответствующие уведомления). Какая у вас конфигурация?

Upd: замечание по коду: учтите, что за один вызов ReadDirectoryChangesW() может вернуться не один буфер, вы должны пройтись по всей цепочке.
 
Код:
FILE_NOTIFY_INFORMATION *pInfo = (FILE_NOTIFY_INFORMATION *)pBuf;
while (pInfo) {
  SelectAction(pInfo);
  pInfo += pInfo->NextEntryOffset;
}
7.4K
08 августа 2011 года
malor
69 / / 20.01.2007
>>Какая у вас конфигурация?

Программу запускаю в WinXP SP3VMware Player 3.1.4), в качестве сетевого диска "Z:" подключена расшаренная папка основной Windows XP SP3.
ФС - NTFS.



278
08 августа 2011 года
Alexander92
1.1K / / 04.08.2008
А вы уверены, что VMWare поддерживает обмен соответствующими уведомлениями? Такой вопрос еще: я так понимаю, вы подключали сетевой диск через стандартные VMWare'овские Shared Folders? Если да - попробуйте сэмулировать полноценный сетевой диск (т.е. назначить виртуалке IP-адрес и подключить сетевой диск, как для физической машины).
10
08 августа 2011 года
Freeman
3.2K / / 06.03.2004
Гм. Кстати, да. Наблюдаю аналогичное поведение у MS Virtual PC -- уж куда роднее для ОС. Тем не менее, приходится нажимать Ctrl+R в FAR, чтобы увидеть изменения.
278
08 августа 2011 года
Alexander92
1.1K / / 04.08.2008
malor, попробуйте ради теста подключить какой-нибудь локальный диск как сетевой. И посмотрите, как ваш код будет работать.
7.4K
08 августа 2011 года
malor
69 / / 20.01.2007
Выставил Bridge в настройках сети в VMware и заработало.

Всем, спасибо!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог