如何在.Net中访问Windows全局文件锁表?

时间:2014-02-14 08:58:52

标签: .net file-locking filelock

有没有办法通过.Net或通过删除.Net中的Win32 API来访问Windows全局文件锁表?

我正在寻找一个更好的解决方案来确定一组文件是否被锁定,而不是检查每个文件以查看是否已对其进行锁定。

1 个答案:

答案 0 :(得分:6)

不,它存储在ring 0代码中。内核代码,只有设备驱动程序才能访问它。通过例如SysInternals的Handle实用程序动态安装的类型。谁的作者还反向设计了未记录的内核结构,以找到该表,并愿意为所有以前和未来的Windows版本维护该代码。希望。

这是用户模式代码无意中无法实现的。当程序试图获取那种信息时,没有任何好事发生。与您的计划一样,检查文件是否已锁定。这根本无法在多任务操作系统上可靠地工作。

假设这样可以工作并且您编写了一个IsLocked()函数。当您发现文件未被锁定时,您将返回 false 。要被中断线程的操作系统上下文切换所抢占,就像IsLocked()返回给调用者一样。并在另一个锁定文件的进程中屈服于另一个线程。当你的线程恢复时,调用者得到 false ,但文件仍被锁定。失败的鲸鱼总数。这样的错误很难排除故障。它会发生,只是不太频繁地发现它为什么不起作用。

锁必须是原子,对于它们正常工作绝对必不可少。换句话说,测试和设置操作必须是不可中断的。在Windows中这很容易做到,只需打开文件即可。如果您无法获得锁定,则会失败。如果没有,那么没有其他人可以打开它,因为你也获得了锁。