2011-11-24 67 views
1

我知道答案必须在某处,我应用了许多其他问题以及来自MSDN本身的建议,但我可能在此忽略了某些内容。尽管锁定块写入文本文件时发生IOException

这是我的方法,我用它来将输出转储到文件。为了清楚起见,附上锁对象声明

private static Object fileLock = new Object(); 
private static void WriteToFile(string msg, bool WriteLine) 
{ 
    lock (fileLock) 
    { 
     msg = DateTime.Now.ToShortTimeString() + " - " + msg; 

     FileInfo F = new FileInfo("dump.txt"); 
     using (StreamWriter writer = F.Exists ? F.AppendText() : F.CreateText()) //<--THIS LINE THROWS 
     { 
      if (WriteLine) 
       writer.WriteLine(msg); 
      else 
       writer.Write(msg); 
     } 
    } 
} 

的问题是:为什么using线之上抛出IOException抱怨另一个进程正在使用该文件的第2次我打电话的方法是什么?

我打电话像这样在我的代码:

Console.WriteLine(something) 
#if(DEBUG) 
    Extensions.WriteToFile(something,true); 
#endif 

同样,我肯定这是一个很小的问题,别人问这样的事情得到正确的答案,但我我无法挖掘它。

UPDATE

重构出FileInfo对象并切换到File.XXX方法制备的代码工作正常。我仍然想知道这个问题是什么,无论如何,这个问题看起来像解决了。

+3

这不会编译,因为您正在从静态方法访问实例成员('fileLock')。锁标识符的声明在实际上是什么样子的? – Guffa

+0

你正在运行你的应用程序的2个实例吗? – user7116

+0

@Guffa fileLock确实是静态的,该行没有像其他代码一样拷贝。编辑修复。 – Alex

回答

2

@Guffa:声明必须是私有静态对象fileLock = new object();

@alex:你的代码在我的机器上工作得很好,虽然它对于任务imo来说有点太复杂。

static void Write(string text, string file) 
    { 
     using (StreamWriter sw = File.AppendText(file))// Creates or opens and appends 
     { 
      sw.WriteLine(text); 
     } 
    } 

也许某些防病毒软件或索引器会锁定您的转储文件。

+0

因为重构FileInfo对象似乎已经解决了这个问题(想知道为什么,但仍然)。谢谢。 – Alex

相关问题