Как получить подкаталог при использовании WinAPI `ReadDirectoryChangesW`?

0

Как получить подкаталог при использовании WinAPI ReadDirectoryChangesW с параметром BOOL bWatchSubtree = TRUE?

MSDN говорит, что если этот параметр имеет значение ИСТИНА, функция контролирует дерево каталогов, внедренное в указанный каталог.
Этот api возвращает только список PFILE_NOTIFY_INFORMATION, ведьма содержит только информацию о имени файла.
В то время как я знаю, что подкаталог witch находится в файле?

typedef struct _FILE_NOTIFY_INFORMATION {
  DWORD NextEntryOffset;
  DWORD Action;
  DWORD FileNameLength;
  WCHAR FileName[1];
} FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;





  void Watch()
{
    while(bShouldWatch)
    {
        if(::ReadDirectoryChangesW(hDir,
                                   myOverLapped.notify,sizeof(myOverLapped.notify),
                                   TRUE,
                                   FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME,
                                   0,&(myOverLapped.overlapped),0))
        {
            DWORD w=::WaitForSingleObject(myOverLapped.overlapped.hEvent,INFINITE);
            if (w==WAIT_OBJECT_0){
                FILE_NOTIFY_INFORMATION *pNotify=(FILE_NOTIFY_INFORMATION*)myOverLapped.notify;
                HandleNotify(pNotify);
                NotifyMsg(WM_PL_TRACKNUM_CHANGED,(WPARAM)pPL,NULL);
            }
        }
    }


}


void HandleNotify(FILE_NOTIFY_INFORMATION *pNotify)
{

    TCHAR szPath[MAX_PATH];
    TCHAR pathFrom[MAX_PATH];
    TCHAR pathTo[MAX_PATH];
    memset(pathTo,0,sizeof(pathTo));

    INT len=0;

    while(1)
    {
        wcsncpy(pathTo+len,pNotify->FileName,pNotify->FileNameLength/sizeof(TCHAR));

        switch(pNotify->Action)
        {
            case FILE_ACTION_ADDED:
                break;
            case FILE_ACTION_REMOVED:
                break;
            case FILE_ACTION_RENAMED_OLD_NAME:
                break;
            case FILE_ACTION_RENAMED_NEW_NAME:
                break;
        }

        if(pNotify->NextEntryOffset!=0)
            pNotify=(FILE_NOTIFY_INFORMATION*)((BYTE*)pNotify+pNotify->NextEntryOffset);
        else break;
    }
Теги:
winapi
monitor

1 ответ

3
Лучший ответ

Из документации [акцент мой]:

Имя файла

Поле переменной длины, которое содержит имя файла относительно дескриптора каталога.

Другими словами, если уведомление предназначено для файла в подкаталоге, FileName включает относительный путь, например, это будет subdir\file.txt а не только file.txt.

  • 0
    Спасибо. Я проверю это через несколько часов.
  • 0
    Да, ты прав. Возвращает subdir \ file.txt

Ещё вопросы

Сообщество Overcoder
Наверх
Меню