Kopieren einer Datei während der StreamWriter läuft

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Kopieren einer Datei während der StreamWriter läuft

    Ich habe einen StreamWriter

    VB.NET-Quellcode

    1. Using sw As New StreamWriter(_sFilename, True)
    2. 'hier werden Daten in die bereits exisiterende .csv Datei angehängt
    3. End Using


    Dieser schreibt jede Sekunde ein paar Daten in _sFilename
    Ich benutzte absichtlich Using um nach jedem Schrieben sicherzustellen, dass die Datei geschlossen wird.
    Grund: hin und wieder wird die Datei evtl. vorzeitig (weil das Schreiben der Daten schon mal mehrere Stunden dauern kann) mittels Windows Explorer manuell kopiert und woanders gespeichert, um sich die Daten schon mal in z.B. Excel ansehen zu können.
    Außerdem will ich vermeiden, dass ein Systemcrash z.B. durch Stromausfall dafür sorgt, dass die Datei unbrauchbar wird.
    Problem: wird copy->paste im Windows Explorer ausgeführt, passiert es mitunter im VB Code, dass eine Exception ausgelöst wird und mitteilt, dass die Datei gerade verwendet wird und daher keine Daten geschrieben werden können.
    Ich umschiffe das jetzt mittels

    VB.NET-Quellcode

    1. Try
    2. Marker:
    3. Using sw As New StreamWriter(_sFilename, True)
    4. 'hier werden Daten in die bereits exisiterende .csv Datei angehängt
    5. End Using
    6. Catch ex As Exception
    7. GoTo Marker
    8. End Try

    Das scheint zu funktioneren. Ich bekomme keine Meldung mehr und alle Daten sind in der Datei.
    Gibt es einen anderen Weg oder kann ich das bedenkenlos so lassen?
    @roepke StreamWriter ist also nicht besonders geeignet für das, was Du vor hast.
    Verwende Files.AppendAllText() oder Files.AppendAllLines, das geht sicherer.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wichtig ist der Fileshare, bei dem du erlaubst wie sich andere zugriffe verhalten. Z.B.:

    C#-Quellcode

    1. using (StreamWriter sw = new StreamWriter(path, new FileStreamOptions() {
    2. Mode = FileMode.Append,
    3. Access = FileAccess.Write,
    4. Share = FileShare.ReadWrite })) {
    5. sw.WriteLine("Test1");
    6. sw.Flush();
    7. sw.WriteLine("Test2");
    8. sw.Flush();
    9. sw.WriteLine("Test3");
    10. sw.Flush();
    11. }


    Damit kannst du das zwischenzeitlich kopieren.

    RodFromGermany schrieb:

    @roepke StreamWriter ist also nicht besonders geeignet für das, was Du vor hast.
    Verwende Files.AppendAllText() oder Files.AppendAllLines, das geht sicherer.

    VB.NET-Quellcode

    1. File.AppendAllText(sFilePathAndName, _s, Encoding.UTF8)

    Scheint zu funktionieren. Worin besteht der Vorteil? Ist das Quick und Dirty um reinen Text (String) in eine Datei zu schreiben?

    roepke schrieb:

    Worin besteht der Vorteil?
    Das System passt auf, dass das erstens schnell und zweitens sicher funktioniert, z.B. mit den richtigen FileOpen-Options.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!