首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步ReadDirectoryChangesW在ERROR_INVALID_PARAMETER中失败

异步ReadDirectoryChangesW在ERROR_INVALID_PARAMETER中失败
EN

Stack Overflow用户
提问于 2013-12-17 15:29:48
回答 1查看 641关注 0票数 1

我成功地同步使用了ReadDirectoryChangesW,但是当我尝试使用完成端口时,ReadDirectoryChangesW总是返回ERROR_INVALID_PARAMETER。我想我的代码中应该有一些明显的错误,但我无法理解。

我的代码是基于如何在完成例程中使用ReadDirectoryChangesW()方法?

代码语言:javascript
复制
   const wchar_t *directory = L"X:\\X";
   HANDLE h = CreateFile(
      directory,
      FILE_LIST_DIRECTORY,
      FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
      NULL, OPEN_EXISTING, 
      FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_OVERLAPPED, NULL);

   if (h==INVALID_HANDLE_VALUE) return;

   HANDLE p = CreateIoCompletionPort(h,0,0,1);
   if (p==NULL) {CloseHandle(h); return;}

   DWORD *buffer =new DWORD[4096];
   DWORD bytesReturned;

   DWORD notifyFilter =  FILE_NOTIFY_CHANGE_FILE_NAME 
                      | FILE_NOTIFY_CHANGE_DIR_NAME 
                      | FILE_NOTIFY_CHANGE_SIZE 
                      | FILE_NOTIFY_CHANGE_LAST_WRITE;

   while (true) {

       OVERLAPPED overlapped;
       memset(&overlapped,0,sizeof(overlapped));

       BOOL success = ReadDirectoryChangesW(h,
            &buffer[0],            
            4096*sizeof(DWORD),
            FALSE, notifyFilter,
            NULL, //&bytesReturned,
            &overlapped,myFileIOCompletionRoutine);

       if (!success) {    
          //always ERROR_INVALID_PARAMETER       
          CloseHandle(h);
          CloseHandle(p);
          return;
       }       
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-26 14:39:26

正如Hans亲切地提醒的那样,文献资料已经说过,如果目录与完成端口相关联,则不能使用完成例程。在本例中,我通过等待完成端口(即ReadDirectoryChangesW(...,&overlapped,0); )来解决问题。

完整的代码如下。

代码语言:javascript
复制
while (true) {
    OVERLAPPED overlapped;
    memset(&overlapped,0,sizeof(overlapped));
    BOOL success = ReadDirectoryChangesW(h,
            &buffer[0],
            4096*sizeof(DWORD),
            FALSE, notifyFilter, 0, &overlapped,0);

    if (!success) {
      if (GetLastError()==ERROR_INVALID_HANDLE) {
        //asynchronously closed by cancel
        CloseHandle(p); //close completion port
        return 0;
      } else {
        CloseHandle(h); //close directory handle
        CloseHandle(p); //close completion port
        return 1;
      }
    }

    DWORD di;
    LPOVERLAPPED lpOverlapped;
    if (!GetQueuedCompletionStatus(p,&bytesReturned,&di,&lpOverlapped,1000)) {
        int ret;
        if (GetLastError()==WAIT_TIMEOUT) {
            if (GetFileAttributes(directory)!=INVALID_FILE_ATTRIBUTES) {
                continue; //timeout
            } else {
                //directory has been deleted or renamed
                ret=0;
            }
        } else {
            //other failure
            ret=1;
        }
        CloseHandle(h); //close directory handle
        CloseHandle(p); //close completion port
        return ret;
    }

    char* ptr = (char*)&buffer[0];
    char* end = ptr+bytesReturned;
    while (ptr<end) {
      FILE_NOTIFY_INFORMATION *info = (FILE_NOTIFY_INFORMATION*) ptr;
      //process FILE_NOTIFY_INFORMATION
      ptr+=info->NextEntryOffset;
      if (!info->NextEntryOffset) break;
    }
  }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20638123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档