none
IOException nach File.Create RRS feed

  • 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


    www.energiewende-mach-ich-selbst.de

    Dienstag, 20. September 2016 10:35

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
    Dienstag, 20. September 2016 13:00

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

    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


    Dienstag, 20. September 2016 10:52
    Moderator
  • 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


    www.energiewende-mach-ich-selbst.de

    Dienstag, 20. September 2016 12:47
  • Hallo Thorsten,
    danke für deinen Beitrag

    Du 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


    www.energiewende-mach-ich-selbst.de

    Dienstag, 20. September 2016 12:52

  • 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
    Dienstag, 20. September 2016 13:00
  • 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

    • Als Antwort markiert frank me Mittwoch, 21. September 2016 06:22
    • Tag als Antwort aufgehoben frank me Mittwoch, 21. September 2016 06:22
    Dienstag, 20. September 2016 15:18
    Beantworter
  • 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


    www.energiewende-mach-ich-selbst.de

    Mittwoch, 21. September 2016 06:27
  • 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


    www.energiewende-mach-ich-selbst.de

    Mittwoch, 21. September 2016 06:36