等待文件可用于使用Win32进行读取

dre*_*lax 8 c file-io winapi synchronous

我正在通过ReadDirectoryChangesW同步调用来查看目录.当一个新文件可用时,我尝试CreateFile使用GENERIC_READ和立即访问它FILE_SHARE_READ,但这给了我ERROR_SHARING_VIOLATION.将文件放入监视目录的过程在我尝试读取它时没有完成写入.

有没有办法可靠地等到文件可供读取?我可以将方法放入如下所示的循环中,但我希望有更好的方法.

while ((hFile = CreateFile (path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)
{
    if (GetLastError() == ERROR_SHARING_VIOLATION)
        Sleep (500);
    else
        break; // some other error occurred
}

if (hFile == INVALID_HANDLE_VALUE)
{
    // deal with other error
    return 0;
}

ReadFile (...);
Run Code Online (Sandbox Code Playgroud)

Nic*_*laz 7

我不认为有关于您正在寻找的事件的通知,但作为改进,我建议逐步延迟.通过这种方式,如果用户在Excel中保持文件打开一小时,您将获得拖放等内容的快速响应时间,并且不会以紧凑的循环占用CPU.

int delay= 10;
while ((hFile = CreateFile (path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)
{
    if (GetLastError() == ERROR_SHARING_VIOLATION) {
        Sleep (delay);
        if (delay<5120) // max delay approx 5.Sec
            delay*= 2;
    }
    else
        break; // some other error occurred
}
Run Code Online (Sandbox Code Playgroud)


nit*_*one 2

据我所知,没有用于通知已关闭文件的用户模式 ​​API。您提出的循环可能确实是最好的方法。您唯一可以做的另一件事就是CloseFile在过滤器驱动程序和进程监视器中进行监视,但是恶心......