Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > ReadDirectoryChangesW(): работает с UNC путями ?


Автор: malor 8.8.2011, 09:40
В коде функция 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.

На http://msdn.microsoft.com/en-us/library/aa365465%28v=vs.85%29.aspx есть такое: 
Цитата
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.


Хотя есть обнадеживающие фразы в топиках:
http://www.delphimaster.net/view/14-90649;
Цитата
"Я проверял только на сетевом диске с NTFS. Там ReadDirectoryChangesW работал."

http://forum.vingrad.ru/act-ST/f-92/t-249280.html
Цитата
"эту задачу можно решить на WinAPI (ReadDirectoryChangesW), если на втором компьютере использовать расшаренный ресурс."

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

VS 2008

Автор: xvr 8.8.2011, 14:13
Видимо ваш Z: не поддерживает отслеживание файловых операций. Z: - это кто?

Добавлено через 36 секунд
Кстати, в hDir не INVALID_HANDLE_VALUE случайно?

Автор: malor 8.8.2011, 14:27
hDir  равен 0x00000fb4.

>>Видимо ваш Z: не поддерживает отслеживание файловых операций. Z: - это кто?

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

user posted image

user posted image

Автор: xvr 8.8.2011, 14:44
Т.е. это у вас сетевая ФС из VMWare. Попробуйте поиграться настройками в самой VMWare - похоже проблемы не Windows, а в VMWare

Автор: malor 8.8.2011, 15:47
Нашел комп с расшаренной папкой в локалке. Примаунтил в виде диска "Z" (действия -  в host-Windows). Функция ReadDirectoryChangesW() запустилась нормально.

>>Попробуйте поиграться настройками в самой VMWare ...

Какие только.

Автор: xvr 8.8.2011, 19:31
Цитата(malor @  8.8.2011,  15:47 Найти цитируемый пост)
Нашел комп с расшаренной папкой в локалке. Примаунтил в виде диска "Z" (действия -  в host-Windows). Функция ReadDirectoryChangesW() запустилась нормально.

Тут важно, не кто монтирует, а куда монтируют. В случае с VMWare монтируют именно к нему, а в случае с сетевым диском в локалке - монтируют к Win, которая расшарила этот самый диск.

Цитата(malor @  8.8.2011,  15:47 Найти цитируемый пост)
Какие только. 

Увы, не в курсе - с VMWare давно не игрался  smile 

Автор: malor 8.8.2011, 19:35
Настроил как Bridged и заработало.
user posted image

Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)