2012-08-08 12 views
8

Eine Anwendung muss eine Datei in einem Verzeichnis erstellen, tun Sie etwas in dem Verzeichnis, und löschen Sie dann die Datei. Zum Beispiel unter der Quellcode:Erstellen dann Löschen von Datei verursacht IOException

File.Create("textfile.txt"); 
// Do something here 
File.Delete("textfile.txt"); 

Wenn „etwas“ ist ein Prozess, der eine sehr kurze Zeit nur braucht, wird File.Delete werfen IOException (Datei von einem anderen Prozess verwendet wird). Laut einem anderen SO Post: Cannot delete directory with Directory.Delete(path, true) sollte der Aufruf von Thread.Sleep (0) den vorherigen Prozess beenden. Aber auch bei

File.Create("textfile.txt"); 
// Do something here 
Thread.Sleep(0); 
File.Delete("textfile.txt"); 

die gleiche IOException noch geworfen werden.

Die Lösung, die ich bekam, ist eine while-Schleife, die versucht, die Datei wiederholt zu löschen, bis sie gelöscht wird. Aber ich frage mich, ob es eine bessere Lösung gibt.

+1

Danke für die sehr schnellen Antworten (und darauf hingewiesen, dass es auf MSDN ist. Ich fühle mich im Moment sicherlich nicht sehr hell). Ich werde mit @usr gehen, weil er der Erste ist. Aber bitte akzeptiere die +1 als Dankeschön. – Jim

Antwort

16

File.Create gibt Ihnen einen FileStream zurück, der ein offenes Handle für diese Datei darstellt. Wickeln Sie das Ergebnis dieses Aufrufs in einen using-Block, um den Handle deterministisch zu schließen.

21

Die Methode File.Create erstellt einen Dateistream, den Sie ordnungsgemäß entsorgen müssen. Ich schlage vor, den folgenden Code:

using(FileStream fs = File.Create("textfile.txt")) 
{ 
    // Do something here. 
} 
File.Delete("textfile.txt"); 

Beachten Sie, dass dieser Code genau wie in der MSDN-Dokumentation vorgeschlagen ...

3

File.Create gibt einen Filestream, die ein offenes Handle auf diese Datei ist. Verwenden Sie stattdessen:

using(FileStream fs = File.Create("textfile.txt")) 
{} 

File.Delete("textfile.txt"); 
4

Beachten Sie auch: Wenn Sie nichts in die Datei schreiben wollen, können Sie die „Verwendung“ auf zwei Arten umgehen:

(1) File.WriteAllText("textfile.txt", string.Empty); 
(2) File.Create("textfile.txt").Dispose(); 

Im Fall (2) es ist sicher, die Verwendung zu vermeiden, weil Sie nichts tun, das eine Ausnahme zwischen dem Erstellen und dem Entsorgen verursachen könnte.

Verwandte Themen