为了获得我正在使用windows api的文件的唯一访问权限:
HANDLE handle = CreateFileW(filepath.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
如果用户偶然使用该文件(即doc)和其他进程,则create files将-1作为句柄返回,并将最后一个错误设置为32。
我的问题如下:我怎么能等到其他进程不再使用该文件? 做类似的事情:
while(handle==INVALID_HANDLE_VALUE)
handle = CreateFileW(filepath.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
真的很愚蠢,因为它浪费了大量的资源尝试并再次尝试。 我想有一个版本的api让你阻止它直到它成功但我没有在文档中找到它!
答案 0 :(得分:0)
至少据我所知,没有单一的功能可以做到这一点(不是特别令人惊讶 - 它几乎可以无限期地阻止)。
由于您(显然)以Win32为目标,一个明显的可能性是读取目标文件的更改日志,并且当您看到某些其他进程已关闭它时,仅重新尝试将其打开以进行独占访问(即,您会看到带有USN_REASON_CLOSE
)的USN记录。
答案 1 :(得分:0)
没有API允许您等待文件直接可用。您可以使用the example code from The Old New Thing找出当前具有打开句柄的进程,然后等待这些进程退出并再次尝试,但如果打开文件的进程提前关闭其句柄,您将看不到。同样,在此期间,其他进程可能已经打开了文件,因此您无法找到一组新的进程并等待它们。
在实践中,轮询循环(短暂睡眠以避免不断旋转)实际上是唯一的方法。您需要检查的不仅仅是INVALID_HANDLE_VALUE
,并且可能希望设置最大超时,因为当问题像权限问题或文件未找到错误这样的问题时永远循环将是一个坏主意。
您可能还需要查看file in use sample on MSDN,了解如何通知用户该问题,而不仅仅是静默轮询。