如何找出进程ID和线程ID /名称打开文件的进程

时间:2010-04-21 02:52:38

标签: c# .net-3.5 file-io

我在应用程序中使用C#,并且在文件被锁定时遇到一些问题。

这段代码就是这样做的,

while (true)
{
   Read a packet from a socket (with data in it to add to the file)
   Open a file // one of these randomly throws an exception saying that the file is locked
   Writes data to it
   Close a file
} 

但在此过程中文件被锁定。我真的不明白,我们是如何肯定地捕获和报告异常,所以我不知道文件每次都不会被关闭。

我最好的猜测是其他东西正在打开文件。它不太可能是另一个应用程序,但它可能是一个不同的线程,但我只是想证明它的方式。有人可以提供一段代码来检查文件是否打开,如果是,请报告processId和threadId文件是否打开。

例如,如果我有这段代码,

StreamWriter streamWriter1 = new StreamWriter(@"c:\logs\test.txt");
streamWriter1.WriteLine("Test");
// code to check for locks??
StreamWriter streamWriter2 = new StreamWriter(@"c:\logs\test.txt");
streamWriter1.Close();
streamWriter2.Close();

这将引发异常,因为当我们第二次尝试打开文件时文件被锁定。那么评论是什么,我可以在那里报告当前应用程序(进程ID)和当前线程(线程ID)文件被锁定?

感谢。

2 个答案:

答案 0 :(得分:2)

这不会直接回答您的问题,但SysinternalsProcess Explorer等免费Process Monitor工具对此类调试非常有用。

答案 1 :(得分:1)

这是一些将跨线程保护资源的伪代码:

while (true)
{
   Read a packet from a socket (with data in it to add to the file)
   lock (static locker object)
   {
       Open a file
       Writes data to it
       Close a file
    }
}

在C#世界中,静态锁定器对象通常在类级别声明:

private static readonly object locker = new object();

如果文件的打开和关闭之间的语句抛出异常,我还建议使用using关键字来保护文件资源。重做伪代码:

while (true)
{
   Read a packet from a socket (with data in it to add to the file)
   lock (static locker object)
   {
       using (Open a file)
       {
           Writes data to it
       } // leaving the using block will close the file
    }
}