【发布时间】:2016-04-14 14:46:20
【问题描述】:
鉴于我有一个所有进程的所有文件句柄的列表,我如何找出这些句柄中的哪些实际上正在锁定文件?
据我了解,我可以简单地尝试打开文件并尝试获取所有权限,如果出现问题,我会知道它已被锁定。但这听起来效率极低。我的意思是我已经有了句柄没有办法检查句柄有哪些权限吗?
我希望看到一个适用于 Windows XP 及更高版本的解决方案。
我已经搜索了GetFileInformationByHandleEx 函数,但我找不到任何有关访问权限的信息。 :/
编辑: 我不需要有关文件锁定的实时信息。我计划处理的文件要么被锁定,直到某些应用程序关闭,要么根本不被锁定。
【问题讨论】:
-
请求宽恕胜过许可
-
您可以通过尝试写入句柄来读取文件的“锁定性”,因为读/写只能由句柄的所有者进行。
-
没有办法做到这一点。任何类型的 IsFileLocked() 函数都无法在多任务操作系统上可靠地工作。它返回的值会立即失效,并且不能保证在您尝试访问文件时它仍然处于解锁状态。您可以通过访问文件来发现,这是原子的。它不是低效的,只有当它被锁定时你会做什么。如果假设的 IsFileLocked() 函数返回 TRUE,这与您所做的完全相同。通过防止其他进程在您打开文件时锁定文件来避免所有这些。
-
@Joel:当您打开文件时,您指定共享模式(以及其他)。您可以打开一个文件进行写入,并允许其他人读取/写入同一文件。处理所有权与此无关。另外,除了读写之外,文件还有其他操作,例如删除它,或查询信息。
-
我不需要文件锁的实时信息。我计划处理的文件要么被锁定,直到某些应用程序关闭,要么根本不被锁定。
标签: c++ windows winapi filehandle filelock