2017-10-04 35 views
-1

我閱讀了多個論壇和解決方案,但沒有人幫助我解決問題。請讓我知道下面一段代碼中的缺陷。系統IO異常無法訪問,因爲已被其他進程使用

public static void WriteLogFile(string writedata) 
    { 
     string path = @"C:\Example.txt"; 
     if (!File.Exists(path)) 
     { 
      File.Create(path); 
      TextWriter tw = new StreamWriter(path); 
      tw.WriteLine(writedata); 
      //tw.Close(); 
     } 
     else if (File.Exists(path)) 
     { 
      using (var tw = new StreamWriter(path, true)) 
      { 
       tw.WriteLine(writedata); 
       //tw.Close(); 
      } 
     } 
    } 
+1

爲什麼你使用''else if''塊中使用()''而不是''if''? –

+0

變化'File.Create(路徑);''來File.Create(路徑).Dispose();' – Equalsk

+0

@Equalsk或只是刪除線作爲一個整體,StreamWriter的將創建該文件,如果它不存在 –

回答

1

這就是你所需要的。

public static void WriteLogFile(string writedata) 
{ 
    string path = @"C:\Example.txt"; 
    using (TextWriter tw = new StreamWriter(path, true)) 
     tw.WriteLine(writedata); 
} 

看一看在MSDN

你會發現,用構造StreamWriter(string, boolean)

使用默認編碼和緩衝區初始化爲指定的文件StreamWriter類的新實例尺寸。如果文件存在,它可以被覆蓋或附加到。如果該文件不存在,則此構造函數將創建一個新文件。

僅供參考,因爲你的方法被調用WriteLogFile,請不要重新發明輪子,並使用日誌庫像log4net的。

編輯,證明其工作

編輯2,你的代碼更改爲以下,以解決多線程場景:

private static readonly object _syncLock = new object(); 
public static void WriteLogFile(string writedata) 
{ 
    lock (_syncLock) 
    { 
     string path = @"C:\rfa\Example.txt"; 
     using (TextWriter tw = new StreamWriter(path, true)) 
      tw.WriteLine(writedata); 
    } 
} 

這是結果,請注意,現在的數字並非如此:

+0

我試過建議的選項仍然是相同的錯誤 – NewLearner

+0

@NewLearner比你做沒有提到的東西,代碼工作正常。 –

+0

@NewLearner請參閱編輯證明 –

相關問題