[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();
		}
	}
});

 

Kolja Engelmann

Technikfan, Freizeitprogrammierer, selbsternannter Toolking und vermutlich größter Drachenfan Deutschlands blogged hier die Lösungen zu IT-Problemen die ihm über den Weg laufen, kleine Softwaretools, nostalgische Anfälle und missbraucht das Ganze gern auch mal als privates Tagebuch und Fotoalbum.

Das könnte dich auch interessieren …

Eine Antwort

  1. AnoNYM sagt:

    Vielen Dank, das hat mir sehr weitergeholfen!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert