Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: ReadDirectoryChangesW() работает с UNC-путями? Либо с сетевыми дисками?  (Прочитано 5137 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
malor
Опытный

ru
Offline Offline

« : 08-08-2011 06:57 » new

В коде функция 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
« Последнее редактирование: 08-08-2011 09:38 от malor » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 08-08-2011 18:12 » 

у тебя точно есть ошибка: &Buffer
ты берёшь адрес указателя, хотя нужет только указатель. Вот мой вариант (только я не компилировал):

Код:
#include <vector>
#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;

std::vector<FILE_NOTIFY_INFORMATION> Buffer(1024);

DWORD BytesReturned=0;

while (ReadDirectoryChangesW(hDir,                     // handle to directory
&Buffer[0],                  // read results buffer
Buffer.size()*sizeof(Buffer[0]),           // length of buffer
TRUE,                     // monitoring option
dwNotificationFlags,
&BytesReturned,           // bytes returned
NULL,                     // overlapped buffer
NULL))                       // completion routine

{
DWORD maxCountToUse=BytesReturned/sizeof(Buffer[0]);
SelectAction(&Buffer[0],min(maxCountToUse,Buffer.size()));
}
dwError = GetLastError();   
CloseHandle(hDir);
return 0;
}

void SelectAction(FILE_NOTIFY_INFORMATION* pArray,DWORD Count)
{
//...
}
« Последнее редактирование: 08-08-2011 18:17 от Алексей1153++ » Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines