{"id":4678,"date":"2017-02-25T09:00:03","date_gmt":"2017-02-25T08:00:03","guid":{"rendered":"https:\/\/www.kolja-engelmann.de\/blog\/?p=4678"},"modified":"2017-02-25T09:20:20","modified_gmt":"2017-02-25T08:20:20","slug":"c-eine-durch-einen-anderen-prozess-blockierte-datei-trotzdem-lesen","status":"publish","type":"post","link":"https:\/\/www.kolja-engelmann.de\/blog\/2017\/02\/c-eine-durch-einen-anderen-prozess-blockierte-datei-trotzdem-lesen\/","title":{"rendered":"[C#] Durch andere Prozesse blockierte Dateien trotzdem lesen"},"content":{"rendered":"<p>Eine Statusdatei sollte\u00a0periodisch 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\u00fcrlich prima.<\/p>\n<pre class=\"lang:c# decode:true \">string _logFileContent = await Task.Run(() =&gt; System.IO.File.ReadAllText(&lt;Dateiname&gt;));<\/pre>\n<p>Im Livebetrieb zeigte sich jedoch, dass die Datei durch den schreibenden Prozess konstant ge\u00f6ffnet blieb und folglich blockiert war. Der Fehler &#8222;<code>Der Prozess kann nicht auf die Datei &lt;Dateiname&gt; zugreifen, da sie von einem anderen Prozess verwendet wird.\"<\/code>\u00a0war die logische Konsequenz.<\/p>\n<h3>Blockierte Datei mittels FileStream und FileShare.ReadWrite trotzdem lesen.<\/h3>\n<p>Nutzt man statt <code>System.IO.File.ReadAllText<\/code> jedoch <code>System.IO.FileStream<\/code> und\u00a0setzt den <code>FileShare<\/code> Mode auf <code>ReadWrite<\/code>, so\u00a0kann man die Datei lesend \u00f6ffnen und erlaubt anderen Prozessen ebenfalls den lesenden und schreibenden Zugriff auf die Datei.<\/p>\n<blockquote><p>Erm\u00f6glicht das nachfolgende \u00d6ffnen der Datei zum Lesen oder schreiben. Wenn dieses Flag nicht angegeben ist, scheitern jede Anforderung zum \u00d6ffnen 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\u00f6nnen zus\u00e4tzliche Berechtigungen dennoch erforderlich sein auf die Datei zugreifen.<\/p><\/blockquote>\n<p>Der funktionierende Code sieht also so aus:<\/p>\n<pre class=\"lang:c# mark:7 decode:true\">string _logFileContent = await Task.Run(() =&gt;\r\n{\r\n\tusing (FileStream _fileStream = new FileStream(\r\n\t\t&lt;Dateiname&gt;,\r\n\t\tFileMode.Open,\r\n\t\tFileAccess.Read,\r\n\t\tFileShare.ReadWrite))\r\n\t{\r\n\t\tusing (StreamReader streamReader = new StreamReader(_fileStream))\r\n\t\t{\r\n\t\t\treturn streamReader.ReadToEnd();\r\n\t\t}\r\n\t}\r\n});<\/pre>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>Eine Statusdatei sollte periodisch gelesen werden, um aktuelle Informationen aus einem ansonsten geschlossenen System auszulesen. Nur in meiner Testumgebung, mit einer lokal liegenden Kopie solch einer Datei, funktionierte das nat\u00fcrlich prima.<\/p>\n","protected":false},"author":1,"featured_media":4679,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[38],"tags":[39],"class_list":["post-4678","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codeschnippsel","tag-c"],"jetpack_featured_media_url":"https:\/\/www.kolja-engelmann.de\/blog\/wp-content\/uploads\/2017\/02\/code-filereader-filestream-fileshare-readwrite.png","jetpack_sharing_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/posts\/4678","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/comments?post=4678"}],"version-history":[{"count":0,"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/posts\/4678\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/media\/4679"}],"wp:attachment":[{"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/media?parent=4678"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/categories?post=4678"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/tags?post=4678"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}