如何在使用WinAPI`ReadDirectoryChangesW`时获取子目录?

时间:2014-09-16 03:51:41

标签: c++ winapi monitor

如何在使用WinAPI ReadDirectoryChangesW时获取子目录,使用param BOOL bWatchSubtree = TRUE?

MSDN说,如果此参数为TRUE,则该函数监视以指定目录为根的目录树 这个api只返回PFILE_NOTIFY_INFORMATION的列表,女巫只包含文件名信息 虽然我怎么知道巫婆子目录是文件位于哪里?

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;
    }

1 个答案:

答案 0 :(得分:3)

来自the documentation [强调我的]:

  

文件名

     

包含相对于目录句柄的文件名的可变长度字段。

换句话说,如果通知是针对子目录中的文件,FileName包含相对路径,例如,它将是subdir\file.txt,而不仅仅是file.txt