2015-10-19 61 views
0

为了让我使用的是Windows API的一个文件,独家推出的访问权限:如何管理SHARING_VIOLATION错误的CreateFile C++后

HANDLE handle = CreateFileW(filepath.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

如果发生意外,用户使用该文件(即DOC)与其他进程创建文件返回-1作为手柄和最后一个错误设置为32

我的问题是:我怎么能等到在文件中没有更多的被其它进程? 做类似:

while(handle==INVALID_HANDLE_VALUE) 
    handle = CreateFileW(filepath.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); 

是非常愚蠢的,因为它浪费了大量的资源,一试再试的。 我想有,让你在它阻止,直到它成功的API的一个版本,但我没有发现它在文档中!

回答

0

没有API,可让您等待文件直接可用。您可以使用the example code from The Old New Thing找出哪些进程目前有一个打开的句柄,然后等待这些进程退出并再次尝试,但如果早期有一个文件打开关闭其句柄的过程,你不会看到。同样,在那段时间,其他进程可能已经打开文件,所以你不能找到一组新的进程并等待它们。

实际上,轮询循环(一个短的睡眠,避免纺纱不断)真的做到这一点的唯一方法。你要检查的不仅仅是INVALID_HANDLE_VALUE多了,很可能需要设置一个最大超时,因为循环永远当问题是愚蠢的东西像一个权限问题还是没有找到错误将是一个坏主意的文件。

您可能也想看看file in use sample on MSDN看到有关通知问题的用户,而不是只是默默的投票。

0

至少就我所知,没有单一的功能,要做到这一点(没有特别令人惊讶 - 它可以阻止几乎无限期)。

既然你(显然)针对Win32中,一个明显的可能性是阅读目标文件更改日志,只有重新尝试打开它以独占访问,当你看到一些其他进程已经关闭了它(即你看到一个USN记录USN_REASON_CLOSE)。