使用C#可以测试文件上是否存在锁定

背景:我使用偏移到文件和文件流锁定/解锁menthods来控制读/写访问。 我正在使用以下代码来测试当前是否在文件上保留了锁

try { fs.Lock( RESERVED_BYTE, 1 ); fs.Unlock( RESERVED_BYTE, 1 ); rc = 1; } catch { rc = 0; } 

题:
我的目标是消除try / catch块。 有没有更好的方法来查看锁是否存在?

编辑:
注意:此问题与文件是否存在无关。 我已经知道了。 它是关于同步写访问。

您可以直接通过P / Invoke层调用LockFile Windows API函数 。 您将使用FileStream上的SafeFileHandle属性返回的句柄。

直接调用API将允许您检查错误条件的返回值,而不是求助于捕获exception。


Noah询问调用P / Invoke层与try / catch是否有任何开销。

Lock文件通过P / Invoke层进行相同的调用,如果对LockFile的调用返回0,则抛出exception。在您的情况下,您不会抛出exception。 如果文件被锁定,您将花费更少的时间,因为您没有处理堆栈展开。

实际的P / Invoke设置大概是七条指令我相信(为了比较,COM interop大约是40),但是这一点没有实际意义,因为你对LockFile的调用与managed方法做的一样(使用P / Invoke)层)。

我个人试图打开它时会抓住一个锁定的文件。 如果它现在已解锁,当您尝试打开它时可能会被锁定(即使它只是几毫秒之后)。

我的目标是消除try / catch块

请记住,文件系统是易失性的 :仅仅因为您的文件处于一种状态进行一次操作并不意味着它将处于下一次操作的相同状态。 您必须能够处理文件系统中的exception。

在某些情况下,您也可以使用WCT ,它通常由调试器或分析器实现,但是它可以在任何代码中使用,因为通常的调试器要求是打开调试端口的线程不是预先请求。 因此,WCT是关于锁争用的非常全面和精确的信息。

一个托管示例 (all-be-it trickey),显示了CLR上本机调试API的特定子集的实用程序。

如果没有尝试,我认为这是不可能的。