[C#] Durch andere Prozesse blockierte Dateien trotzdem lesen
Eine Statusdatei sollte periodisch gelesen werden, um aktuelle Informationen aus einem ansonsten geschlossenen System auszulesen. In meiner Testumgebung, mit einer lokal liegenden Kopie solch einer Datei, funktionierte das natürlich prima.
string _logFileContent = await Task.Run(() => System.IO.File.ReadAllText(<Dateiname>));
Im Livebetrieb zeigte sich jedoch, dass die Datei durch den schreibenden Prozess konstant geöffnet blieb und folglich blockiert war. Der Fehler „Der Prozess kann nicht auf die Datei <Dateiname> zugreifen, da sie von einem anderen Prozess verwendet wird."
war die logische Konsequenz.
Blockierte Datei mittels FileStream und FileShare.ReadWrite trotzdem lesen.
Nutzt man statt System.IO.File.ReadAllText
jedoch System.IO.FileStream
und setzt den FileShare
Mode auf ReadWrite
, so kann man die Datei lesend öffnen und erlaubt anderen Prozessen ebenfalls den lesenden und schreibenden Zugriff auf die Datei.
Ermöglicht das nachfolgende Öffnen der Datei zum Lesen oder schreiben. Wenn dieses Flag nicht angegeben ist, scheitern jede Anforderung zum Öffnen der Datei zum Lesen oder Schreiben (durch diesen Prozess oder einen anderen Prozess), bis die Datei geschlossen wird. Aber auch wenn dieses Flag angegeben ist, können zusätzliche Berechtigungen dennoch erforderlich sein auf die Datei zugreifen.
Der funktionierende Code sieht also so aus:
string _logFileContent = await Task.Run(() => { using (FileStream _fileStream = new FileStream( <Dateiname>, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (StreamReader streamReader = new StreamReader(_fileStream)) { return streamReader.ReadToEnd(); } } });
Vielen Dank, das hat mir sehr weitergeholfen!