2017-01-26 1 views
1

ich eine Log-Datei, die ich jedes Mal meine Anwendung gestartet wird, wie so löschen und erstellen:File.AppendAllText verursacht Zugriffs Ausnahme ausgelöst werden, wenn Programmlauf zum zweiten Mal

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

Und ich schreibe darin File.AppendAllText wie so mit:

File.AppendAllText(LogPath, logMessage); 

Mein Problem ist, dass, wenn ich das Programm zum zweiten Mal ausführen, die oben Aufruf eine Ausnahmedatei geworfen werden verursacht sagen nicht

zugegriffen werden

„weil sie von einem anderen Prozess verwendet wird“

Was ist mit diesem Ansatz ist falsch?

+0

Zwei Instanzen des Programms laufen zur gleichen Zeit? –

+0

ist dies der einzige Code, der die von LogPath angegebene Datei betrifft? Ich hätte einen Fehler mit 'File.Delete (LogPath);' bevor Sie sogar zu 'File.AppendAllText (LogPath, logMessage);'. –

Antwort

0

Sie müssten die Datei nach der Erstellung für die weitere Verarbeitung schließen.

Andere Möglichkeit könnte sein, WriteAllText zu verwenden, und Sie müssen es nicht jedes Mal löschen.

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

'mit (var handler = File.Create (LogPath)) {...}' ist eine bessere Technik - nicht 'IDisposable' (Stream im Kontext) manuell schließen –

+0

OK @DmitryBychenko Ich habe es aktualisiert, danke:) –

3

Dies ist nicht wegen File.AppendAllText sondern diese Codezeile:

File.Create(LogPath); 

Per the documentation of File.Create(string):

Rückgabewert
Typ: System.IO.FileStream
Ein FileStream, der Lese-/Schreibzugriff auf die im Pfad angegebene Datei bietet.

Es gibt ein offenes FileStream Objekt. Sie müssen dieses Objekt entsorgen, um den Stream zu schließen und die Datei freizugeben. Wenn Sie dies nicht tun, hält dieses Objekt die Datei offen, bis GC das Objekt zu einem späteren Zeitpunkt unbestimmt finalisiert.

Hier ist, wie diese Zeile Code zu schreiben, entweder eine der folgenden zwei Alternativen arbeiten:

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

Was passiert ist, dass das zweite Mal, wenn Ihr Programm die Datei lief vorhanden ist, so dass Sie es gelöscht und dann es neu erstellt, aber der "neu erstellt es" Teil hielt die Datei geöffnet, so dass, als es kurze Zeit später die File.AppendAllText Methode erreichte, die Datei noch geöffnet war.

Hinweis: Wenn Sie immer Anruf File.AppendAllText Sie können es einfach nur löschen, wie AppendAllText die Datei erstellen, wenn es nicht bereits vorhanden, wie pro the documentation of File.AppendAllText:

eine Datei öffnet, hängt die angegebene Zeichenfolge an die Datei an und schließt dann die Datei. Wenn die Datei nicht existiert, erstellt diese Methode eine Datei, schreibt die angegebene Zeichenfolge in die Datei und schließt dann die Datei.

(Hervorhebung von mir)

4

Es wird von File.Create() verursacht. Entfernen Sie es und File.AppendAllText erstellt eine neue Datei, wenn sie nicht existiert.

Hinweis:
File.Create() gibt einen FileStream Wert, wenn Sie es nicht schaffen Sie, dann wird es einen Fehler verursachen, wenn Sie darauf zugreifen möchten.

+0

Und der Grund, dass Ihr Code das erste Mal funktioniert, aber nicht der zweite, ist, dass Sie nicht die Klausel eingeben, in der der Aufruf 'create()' zum ersten Mal gemacht wird. – arbitrarystringofletters

+0

Es ist kristallklar, danke! – Toto

0

Sie wahrscheinlich bedeuten

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

können Sie versuchen, Clearing kombiniert und in einem Aufruf zu schreiben:

File.WriteAllText(LogPath, logMessage); 

Wenn die Datei vorhanden ist, WriteAllText wird es klar und schreiben logMessage; Wenn die Datei nicht existiert, erstellt WriteAllText sie und schreibt logMessage.

Verwandte Themen