2011-11-24 70 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