2016-09-14 51 views
0

有很多解釋如何清空日誌文件。清除C#中鎖定的日誌文件的內容

像:

File.WriteAllText(activeTab.FileName, string.Empty); 

但是這個例子和其他的例子,我發現所有有同樣的問題。如果日誌文件當前被另一個進程鎖定,則它不起作用。

在ruby中有一個任務我可以使用​​不刪除,只是清空日誌文件。

我發現我也可以用Powershell使用clc <filename>。 來源可現在這裏:

https://github.com/PowerShell/PowerShell/blob/c1faf1e6e10fc1ce45e84ef6f49ae7136c67a111/src/Microsoft.PowerShell.Commands.Management/commands/management/ClearContentCommand.cs

但老實說,我不明白這個代碼是如何工作的,也從其他類繼承。

是否有可用於任何常用程序/類的C#實現?

+0

總之,如果一個文件被鎖定你(*您=任何其他進程/線程*)不能刪除或修改(「空」)它。有很多第三方日誌庫,我會推薦任何一天試圖推出自己的。然後使用一個庫將確保你不必擔心這樣的事情,因爲這些庫中的一些已經存在了,只要我記得,並且非常強大和可配置。我個人最喜歡的是[Log4Net](https://logging.apache.org/log4net/),但[NLog](http://nlog-project.org/)也很受歡迎。 – Igor

+1

IMO,這不是一個合理/安全的事情。你應該弄清楚如何讓任何人拿着文件鎖釋放它。 – jlew

+0

您不能破壞另一個進程的文件鎖定。你所能做的就是將數據排隊到某個地方,並且繼續檢查要釋放的鎖,然後完成你的動作(編輯/刪除/清除)。 –

回答

0

原來,該文件可以在我的情況下,使用這段代碼清除:

var stream = new FileStream(FileName, FileMode.Truncate, FileAccess.ReadWrite, FileShare.ReadWrite | FileShare.Delete); 
    stream.Close(); 
+1

似乎與大多數託管代碼工具(包括PowerShell)在打開文件時省略「FileShare.Delete」選項有關。較舊的本地代碼應用程序通常會打開帶有共享/刪除功能的文件。這是我喜歡舊方式更好的情況之一。 –