2017-01-26 97 views
1

程序運行我有刪除和創建每次我的應用程序被啓動,像這樣的時間日誌文件被拋出訪問異常:File.AppendAllText導致當第二次

if (File.Exists(LogPath)) 
{ 
    File.Delete(LogPath); 
    File.Create(LogPath); 
} 

而且我寫它使用File.AppendAllText像這樣:

File.AppendAllText(LogPath, logMessage); 

我的問題是,當我跑第二次的節目,上面的調用導致拋出話說文件無法訪問異常

「因爲它正被另一個進程使用」

有什麼不對的這種做法?

+0

程序的兩個實例正在同時運行? –

+0

這是影響LogPath指定文件的唯一代碼嗎?我會在File.AppendAllText(LogPath,logMessage);'之前預料到有'File.Delete(LogPath);'的錯誤。 –

回答

0

您需要在創建後關閉文件以進一步處理。

if (File.Exists(LogPath)) 
{ 
    File.Delete(LogPath); 
    using(var handler = File.Create(LogPath)) 
    { 

    } 
} 

其他方式可以使用WriteAllText,你不需要每次都刪除它。

File.WriteAllText(LogPath, "contents"); 
+1

'使用(var處理程序= File.Create(LogPath)){...}'是一個更好的技術 - 不要關閉IDisposable'(流在上下文中)手動 –

+0

行@DmitryBychenko我已更新它,謝謝: ) –

3

這是不是因爲File.AppendAllText而是這行代碼:

File.Create(LogPath); 

the documentation of File.Create(string)

返回值
類型:System.IO.FileStream
一個FileStream,它提供對路徑中指定的文件的讀/寫訪問。

返回打開FileStream對象。您需要處理此對象以關閉流並釋放文件。如果你不這樣做,那麼這個對象將保持文件打開狀態,直到GC在稍後不確定的時間點完成對象。

下面是如何寫這行代碼,以下兩種備選方案之一將工作:

File.Create(LogPath).Dispose(); 
using (File.Create(LogPath)) { } 

發生了什麼事時,你的程序運行該文件的第二次存在,所以你刪除它,然後重新創建它,但「重新創建它」部分保持文件打開,所以當很短的時間後到達File.AppendAllText方法時,文件仍然打開。

注意:如果您總是通話File.AppendAllText你可以簡單地刪除它,因爲AppendAllText將創建文件,如果它不存在,按照the documentation of File.AppendAllText

打開一個文件,將指定的字符串追加到文件中,然後關閉該文件。 如果該文件不存在,則此方法將創建一個文件,將指定的字符串寫入該文件,然後關閉該文件。

(我的重點)

4

它是由File.Create()引起的。刪除它並File.AppendAllText創建一個新文件,如果它不存在。

注:
File.Create()返回FileStream值,如果你不處理它,那麼它會在您要訪問它導致錯誤。

+0

你的代碼第一次運行的原因,但不是第二次,因爲你沒有第一次進入'create()'調用的子句。 – arbitrarystringofletters

+0

很清楚,謝謝! – Toto

0

你,很可能意味着

// clear the file (write an empty text to it) if it exists 
if (File.Exists(LogPath)) 
{ 
    File.WriteAllText(LogPath, ""); 
}  
...  
File.AppendAllText(LogPath, logMessage); 

你可以嘗試結合清算和一個看漲期權:

File.WriteAllText(LogPath, logMessage); 

如果該文件存在,將WriteAllText清除它,寫logMessage;如果文件不存在,WriteAllText將創建它並編寫logMessage

相關問題