Ich versuche festzustellen, ob eine Datei zur Laufzeit vorhanden ist. Wenn nicht, erstellen Sie sie. Ich erhalte jedoch diesen Fehler, wenn ich versuche, darauf zu schreiben:
Der Prozess kann nicht auf die Datei 'myfile.ext' zugreifen, da sie von einem anderen Prozess verwendet wird.
string filePath = string.Format(@"{0}\M{1}.dat", ConfigurationManager.AppSettings["DirectoryPath"], costCentre);
if (!File.Exists(filePath))
{
File.Create(filePath);
}
using (StreamWriter sw = File.AppendText(filePath))
{
//write my text
}
Irgendwelche Ideen, wie man das Problem beheben kann?
File.Create()
Methode verwenden! Das obige Snippet erstellt die Datei bereits!Ich möchte diese Antwort aktualisieren, um zu sagen, dass dies nicht wirklich die effizienteste Art ist, den gesamten Text zu schreiben. Sie sollten diesen Code nur verwenden, wenn Sie etwas schnelles und schmutziges benötigen.
Ich war ein junger Programmierer, als ich diese Frage beantwortete, und damals dachte ich, ich wäre eine Art Genie, um diese Antwort zu finden.
quelle
FileStream(string, FileMode)
Konstruktor auch weiterhin verwenden und FileMode.Create übergeben , wodurch alle vorhandenen Dateien überschrieben werden. Es ist immer noch nicht erforderlich, die Datei zweimal zu öffnen. Diese Antwort wurde auch bearbeitet, nachdem ich meinen ursprünglichen Kommentar gepostet habe..Close()
am Ende hinzufügen können , damit es auf jeden Fall funktioniert. Ich misstraue dem System der VerwendungFileStream
für alles, weil ich nicht möchte, dass die Ausnahme auftritt,FileMode.Create
dass die Datei bereits vorhanden ist - insbesondere, wenn ich den Inhalt löschen und nicht durchhängen möchteFileMode.Open
. Funktioniert für michFileStream
erst dann wirklich, wenn Sie die betreffende Datei entfernt und dann darauf geschrieben haben. DaFile.Create
es offen und gesperrt bleibt, scheint.Close()
es der einzige wirkliche Weg zu sein, mit meinem Szenario und meinen SOs umzugehen.Beim Erstellen einer Textdatei können Sie den folgenden Code verwenden:
Verwenden Sie den Code aus Ihrem Kommentar. Die von Ihnen erstellte Datei (Stream) muss geschlossen sein. File.Create gibt den Dateistream an die gerade erstellte Datei zurück:
quelle
File.Create
kehrt zurückFileStream
und das hatClose()
quelle
File.Create gibt einen FileStream zurück. Sie müssen das schließen, wenn Sie in die Datei geschrieben haben:
Sie können using verwenden, um die Datei automatisch zu schließen.
quelle
StreamWriter
wie aus seiner Verwendung von abgeleitet werden kannFile.AppendText
.Ich habe Ihre Frage mit dem Code-Snippet aktualisiert. Nach dem richtigen Einrücken ist sofort klar, wo das Problem liegt: Sie verwenden das zurückgegebene,
File.Create()
aber schließen es nichtFileStream
.Dies ist nicht erforderlich. Sie können
StreamWriter
bereits an eine vorhandene Datei anhängen und eine neue Datei erstellen, falls diese noch nicht vorhanden ist. So was:Welches verwendet diesen
StreamWriter
Konstruktor .quelle
Diese Frage wurde bereits beantwortet, aber hier ist eine reale Lösung, die prüft, ob das Verzeichnis vorhanden ist, und am Ende eine Nummer hinzufügt, wenn die Textdatei vorhanden ist. Ich verwende dies zum Erstellen von täglichen Protokolldateien in einem von mir geschriebenen Windows-Dienst. Ich hoffe das hilft jemandem.
quelle
Ich weiß, dass dies eine alte Frage ist, aber ich möchte sie nur da rauswerfen, die Sie noch verwenden
File.Create("filename")"
können. Fügen Sie.Dispose()
sie einfach hinzu .File.Create("filename").Dispose();
Auf diese Weise wird die Datei erstellt und geschlossen, damit der nächste Prozess sie verwenden kann.
quelle
File.Create(FilePath).Close();
aus der obigen Antwort hatthis.Dispose(true); GC.SuppressFinalize((object) this);
in seiner Umsetzung.Ich glaube, ich kenne den Grund für diese Ausnahme. Möglicherweise führen Sie dieses Code-Snippet in mehreren Threads aus.
quelle
Versuchen Sie Folgendes: Es funktioniert auf jeden Fall. Wenn die Datei nicht vorhanden ist, wird sie erstellt und anschließend geschrieben. Und wenn es bereits existiert, wird es problemlos geöffnet und darauf geschrieben:
quelle