2016-09-14 8 views
0
löschen

Es gibt viele Erklärungen, wie man eine Protokolldatei leeren kann.Inhalt einer gesperrten Protokolldatei in C#

Like:

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

Aber dieses Beispiel und andere Beispiele, die ich alle haben das gleiche Problem gefunden. Es funktioniert nicht, wenn die Logdatei derzeit von einem anderen Prozess gesperrt ist.

In Ruby gibt es eine Aufgabe, die ich rake log:clear verwenden kann, die nicht entfernen, nur die Protokolldateien leeren.

Ich fand auch, dass ich dies mit Powershell mit clc <filename> kann. Die Quellen verfügbar sind jetzt hier:

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

Aber ehrlich gesagt verstehe ich nicht, wie dieser Code funktioniert, auch erbt sie von anderen Klassen.

Gibt es eine C# -Implementierung, die ich in jedem gängigen Programm/Klasse verwenden kann?

+0

Kurz gesagt, wenn eine Datei, die Sie gesperrt ist (* Sie = anderer Prozess/Thread *) können es nicht löschen oder modifiziere ("leer") es. Es gibt viele Logging-Bibliotheken von Drittanbietern, die ich jeden Tag empfehlen würde, wenn Sie versuchen, Ihre eigenen zu rollen. Die Verwendung einer Bibliothek stellt dann sicher, dass Sie sich nicht um solche Dinge sorgen müssen, da einige dieser Bibliotheken so lange verfügbar sind, wie ich mich erinnern kann und die sehr robust und konfigurierbar sind. Mein persönlicher Favorit ist [Log4Net] (https://logging.apache.org/log4net/), aber auch [NLog] (http://nlog-project.org/) ist sehr beliebt. – Igor

+1

IMO, das ist keine vernünftige/sichere Sache zu tun. Sie sollten herausfinden, wie Sie die Datei sperren können, um sie zu veröffentlichen. – jlew

+0

Sie können die Dateisperre eines anderen Prozesses NICHT unterbrechen. Alles, was Sie tun können, ist, die Daten an einer beliebigen Stelle einzureihen und die Freigabe der Sperre zu überprüfen und dann Ihre Aktion auszuführen (bearbeiten/löschen/löschen). –

Antwort

0

Es stellt sich heraus, dass die Datei in meinem Fall mit diesem Code-Schnipsel gelöscht werden:

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

Scheint mit der Tatsache zusammenzuhängen, dass die meisten verwalteten Code-Tools (einschließlich PowerShell) beim Öffnen von Dateien die Option 'FileShare.Delete' weglassen. Ältere Anwendungen mit systemeigenem Code öffnen im Allgemeinen Dateien mit Freigabe/Löschen, die zulässig sind. Dies ist einer jener Fälle, in denen ich den alten Weg lieber mag. –

Verwandte Themen