代码之家  ›  专栏  ›  技术社区  ›  Noah

使用C#是否可以测试文件上是否持有锁

  •  2
  • Noah  · 技术社区  · 17 年前

    背景: 我使用文件的偏移量和Filestream lock/unlock方法来控制读/写访问。我使用以下代码来测试文件当前是否持有锁

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


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

    5 回复  |  直到 17 年前
        1
  •  6
  •   Community Mohan Dere    9 年前

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


    Noah 询问对P/Invoke层的调用与try/catch的调用之间是否存在开销。

    我认为,实际的P/Invoke设置大约有七条指令(比较而言,COM interop大约有40条),但这一点没有意义,因为对LockFile的调用与托管方法所做的事情相同(使用P/Invoke层)。

        2
  •  5
  •   Jon B    17 年前

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

        3
  •  4
  •   Joel Coehoorn    17 年前

    记住,文件系统是 :仅因为您的文件在一个操作中处于一种状态,并不意味着在下一个操作中它将处于相同的状态。您必须能够处理来自文件系统的异常。

        4
  •  1
  •   RandomNickName42    17 年前

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

    managed example (尽管有些棘手),show的实用程序用于CLR上本机调试API的这个特定子集。

        5
  •  0
  •   Konstantin Tarkus    17 年前