Benutzer mit den meisten Antworten
IOException nach File.Create

Frage
-
Hallo,
in meinem Code prüfe ich ob eine bestimmte Datei vorhanden ist oder nicht und lasse diese ggf. erzeugen.
Anschließend erstelle ich einen neuen Streamwriter für diese Datei.if (!File.Exists(path)) File.Create(path); TextWriter tw = new StreamWriter(path, false, System.Text.Encoding.ASCII)
Wenn nun die Datei (path) nicht vorhanden ist, so kommt es in der dritten Zeile zu einer Exception:
System.IO.IOException wurde nicht behandelt. _HResult=-2147024864 _message=The process cannot access the file 'C:\Users\Anwender\AppData\Roaming\Gesim\data\g_code\9999.nc' because it is being used by another process.
Die Datei ist auch sonst nirgends geöffnet. Sie war nicht vorhanden und wurde in der Zeile darüber erzeugt.
Kann es sein dass der Prozess des Create nicht abgeschlossen ist?
Kann man den direkt abschließen? (--> File.Finish() )
Oder wie kommt es zu dieser Exception?Grüße,
von Frank
Antworten
-
Aber mein Problem ist doch, dass das File offen ist. Um den StreamWriter anzulegen muss das File aber geschlossen sein.
Hi,
dann erstelle den streamwriter aus dem FileStream... [Du kannst den StreamWriter mit den gleichen Parametern erstellen, wahlweise mit einem string als fileName oder eben einem Stream, siehe die Konstruktoren hier:
https://msdn.microsoft.com/de-de/library/system.io.streamwriter(v=vs.110).aspx ]
siehe BeispielCode z.B. hier:
https://msdn.microsoft.com/de-de/library/wtbhzte9(v=vs.110).aspx
Viele Grüße,
Thorsten
- Bearbeitet Thorsten Gudera Dienstag, 20. September 2016 13:03
- Als Antwort markiert frank me Mittwoch, 21. September 2016 06:24
Alle Antworten
-
Hi,
Du könntest die Datei ja *öffnen* (File.Open) mit FileMode OpenOrCreate (so dass Du nicht prüfen musst, ob sie bereits vorhanden ist...):
https://msdn.microsoft.com/de-de/library/b9skfh7s(v=vs.110).aspx
und
https://msdn.microsoft.com/de-de/library/system.io.filemode(v=vs.110).aspx
Viele Grüße,
Thorsten
- Bearbeitet Thorsten Gudera Dienstag, 20. September 2016 10:52
-
Hallo Frank,
File.Create liefert bereits einen Stream auf die Datei zurück. Diesen solltest Du auch verwenden. Siehe dazu:
https://msdn.microsoft.com/de-de/library/d62kzs03.aspx
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Dienstag, 20. September 2016 10:52
-
Hallo Stefan,
danke für die Nachricht.File.Create liefert bereits einen Stream auf die Datei zurück. Diesen solltest Du auch verwenden.
File.Create liefert aber einen FileStream und ich brauche einen StreamWriter.
Weiterhin will ich dem Objekt noch parameter zuweisen (bool append, Encoding encoding).Von daher kann ich mit dem Vorschlag leider nicht viel anfangen.
Wie kann ich die zwei genannten Probleme lösen?Frank
-
Hallo Thorsten,
danke für deinen BeitragDu könntest die Datei ja *öffnen* (File.Open) mit FileMode OpenOrCreate (so dass Du nicht prüfen musst, ob sie bereits vorhanden ist...):
Aber mein Problem ist doch, dass das File offen ist. Um den StreamWriter anzulegen muss das File aber geschlossen sein.
Frank
-
Aber mein Problem ist doch, dass das File offen ist. Um den StreamWriter anzulegen muss das File aber geschlossen sein.
Hi,
dann erstelle den streamwriter aus dem FileStream... [Du kannst den StreamWriter mit den gleichen Parametern erstellen, wahlweise mit einem string als fileName oder eben einem Stream, siehe die Konstruktoren hier:
https://msdn.microsoft.com/de-de/library/system.io.streamwriter(v=vs.110).aspx ]
siehe BeispielCode z.B. hier:
https://msdn.microsoft.com/de-de/library/wtbhzte9(v=vs.110).aspx
Viele Grüße,
Thorsten
- Bearbeitet Thorsten Gudera Dienstag, 20. September 2016 13:03
- Als Antwort markiert frank me Mittwoch, 21. September 2016 06:24
-
Hallo Frank,
das wäre in etwa so:
using (var stream = new FileStream(@"C:\TEMP\file.dat", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read)) { // Encoding.ASCII ist (fast) immer falsch, da es nur 7 Bit Zeichen erlaubt // für die Windows Kodierung (Windows-1252 in Westeuropa) verwende man Encoding.Default using (var writer = new StreamWriter(stream), Encoding.Default) { // ... was schreiben } }
Wobei das FileShare Argument angibt was ein anderer Prozess, Faden damit anstellen darf. Es setzt aber voraus, dass dies an diesen anderen Stelle auch beachtet wird; aber aufpassen dass kein Datensalat heraus kommt ;)
Im übrigen willst Du sehr wahrscheinlich nicht Encoding.ASCII, denn damit sind alle Zeichen > 128 nicht zulässig (u. a. deutsche Umlaute), sondern vielmehr Encoding.Default, womit die lokale ANSI 8-Bit Codepage (in Deutschland in der Regel Windows 1252) verwendet wird.
Gruß Elmar
-
https://msdn.microsoft.com/de-de/library/system.io.streamwriter(v=vs.110).aspx ]
Danke Torsten,
ich habe es hinbekommen, sieht nun so aus:
FileStream fileStream = File.Open(path, FileMode.OpenOrCreate); TextWriter tw = new StreamWriter(fileStream, System.Text.Encoding.ASCII);
Grüße,
von Frank
-
Encoding.ASCII ist (fast) immer falsch, da es nur 7 Bit Zeichen erlaubt
Hallo Elmar,
vielen Dank für deinen Post!
ASCII ist in meinem Fall richtig, da es sich um einen GCode handelt und der muss als ASCII übergeben werden.
Herzliche Grüße,
von Frank