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

标签 .net file-locking filelock

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

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

最佳答案

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

这是故意超出用户模式代码范围的。当程序试图获取此类信息时,不会有任何好事发生。就像你的计划一样,检查文件是否被锁定。这根本无法在多任务操作系统上可靠地工作。

假设这可行,并且您将编写一个 IsLocked() 函数。当您发现文件未锁定时,您将返回false。被操作系统上下文切换抢占,该切换会在 IsLocked() 返回调用者时中断您的线程。并屈服于另一个进程中锁定文件的另一个线程。当你的线程恢复时,调用者得到false,但文件仍然被锁定。彻底失败的鲸鱼。这样的错误非常难以排除。它会发生,只是频率不够高,无法发现它不起作用的原因。

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

关于.net - 如何在.Net中访问Windows全局文件锁表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21774854/

相关文章:

.net - 如何使 .net 程序集文件尽可能小?

.net - Silverlight 提供什么?

C# 公共(public)静态字典

c++ - 在另一个程序锁定文件时读取文件

java - 无法读取新锁定的文件

java - java中的进程同步

perl - 我的 Linux 守护进程如何知道 Windows 程序何时停止写入我通过 SAMBA 访问的文件?

c# - 在不锁定 dll 文件的情况下使用 .NET 程序集

Java NIO FileLock 允许其他进程写入锁定的文件

c - linux fcntl 文件锁定超时