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)
我不认为有关于您正在寻找的事件的通知,但作为改进,我建议逐步延迟.通过这种方式,如果用户在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)
据我所知,没有用于通知已关闭文件的用户模式 API。您提出的循环可能确实是最好的方法。您唯一可以做的另一件事就是CloseFile在过滤器驱动程序和进程监视器中进行监视,但是恶心......
| 归档时间: |
|
| 查看次数: |
3432 次 |
| 最近记录: |