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

时间:2009-03-30 18:26:02

标签: c# locking filestream

背景 我在文件中使用偏移量,并使用Filestream锁定/解锁menthod来控制读/写访问。我正在使用以下代码来测试当前是否锁定文件

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

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

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

5 个答案:

答案 0 :(得分:6)

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

直接调用API将允许您检查错误条件的返回值,而不是诉诸捕获异常。


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

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:4)

  

我的目标是消除try / catch块

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

答案 3 :(得分:1)

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

A managed example(可能有点三角),显示CLR上本机调试API的特定子集的实用程序。

答案 4 :(得分:0)

我认为没有尝试,赶上它是不可能的。