Waiting until a file is available for reading with Win32

后端 未结 4 613
情话喂你
情话喂你 2020-12-07 01:22

I\'m watching a directory by calling ReadDirectoryChangesW synchronously. When a new file is available, I try to access it immediately with CreateFile

4条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-07 01:53

    As @Matt Davis said, there is unfortunately no user-mode API but there is a workaround that depending on your use-case (I've written mine below) may do just what you want.

    What worked for me in the past was registering for FILE_NOTIFY_CHANGE_LAST_WRITE instead of FILE_NOTIFY_CHANGE_FILE_NAME when calling ReadDirectoryChangesW:

    ZeroMemory(&overlapped, sizeof(OVERLAPPED));
    overlapped.hEvent = hChangeEvent;
    
    // ...    
    ReadDirectoryChangesW(hSpoolPath,
                          eventBuffer,
                          EVENT_BUF_LENGTH,
                          FALSE,
                          FILE_NOTIFY_CHANGE_LAST_WRITE, // <----
                          NULL,
                          &overlapped,
                          NULL);
    // ...
    HANDLE events[2];
    
    events[0] = hChangeEvent;
    events[1] = hCancelEvent;
    
    DWORD wRc = WaitForMultipleObjects(2, events, FALSE, DIRECTORY_WATCH_TIMEOUT);
    

    The last write time gets updated as soon as the owning process closes the handle after creating the file and writing to it.

    My use-case was one process that received HTTP-requests via TCP/IP and wrote the HTTP-body into a directory, where another process picked it up as soon as the receiving process was finished writing (and consequently closing the handle) it. The http-server was the only process that wrote to that directory, so I could rely on the create-write-close pattern.

提交回复
热议问题