none
Zugriff auf Textdateien via VB.NET: Wie schließe ich einen Streamwriter oder Streamreader richtig? RRS feed

  • Frage

  • Hallo zusammen,

    ich habe hier ein paar Zeilen Programmcode, um Text in eine Textdatei zu schreiben und sie gleich danach wieder auszulesen. Beim ersten Ausführen der Prozedur geht alles wie geplant, bei der zweiten Ausführung der Prozedur gleich danach mault VB, dass sich die Textdatei noch im Zugriff befände.

    Hier mein Code:

     

     

    Public Sub sub_pubchangetextfile() Dim var_filenamefullpath As String Dim var_filecontent As String = "" Dim var_row As String = "" Dim var_position As Integer var_filenamefullpath = frm_hauptmaske.text_textfilenamefullpath.Text Dim var_streamwriter As New System.IO.StreamWriter(var_filenamefullpath) var_streamwriter.WriteLine(frm_hauptmaske.text_textfilechangedcontent.Text) var_streamwriter.Close() var_streamwriter = Nothing Dim var_streamreader As New System.IO.StreamReader(var_filenamefullpath) var_streamreader = IO.File.OpenText(var_filenamefullpath) Do While var_streamreader.Peek() >= 0 var_row = var_streamreader.ReadLine() var_position = InStr(1, var_row, "@", CompareMethod.Text) If var_position = vbNull Or var_position = 0 Then Else MsgBox("Erwischt.") End If var_filecontent = var_filecontent & vbCrLf & var_row Loop frm_hauptmaske.text_textfilenewcontent.Text = var_filecontent var_streamreader.Close() var_streamreader = Nothing

     

    Ich sage sowohl beim Reader als auch beim Writer hinterher close() und setze den Wert auf "Nothing". Habe ich was vergessen?

    Gruß

    Thomas

    Donnerstag, 8. November 2012 07:21

Antworten

  • Bei allen Objekten, die ein Dispose vorsehen, sollte das Dispose auch genutzt werden. Im Dispose werden z.B. Datei-Handle freigegeben. Am einfachste ist die Nutzung von Using, was ein Dispose impliziert.
     
    --
    Viele Gruesse
    Peter
    Donnerstag, 8. November 2012 07:59
  • Hallo Thomas,

    Du machst zwei Reader auf:

         Dim var_streamreader As New System.IO.StreamReader(var_filenamefullpath)
            var_streamreader = IO.File.OpenText(var_filenamefullpath)

    Die erste Zeile erzeugt einen StreamReader über den Konstruktor,
    die zweite verwendet OpenText - was im Hintergrund ebenfalls einen StreamReader erzeugt.

    Da Du die erste Instanz einfach "vergisst", bleibt sie offen - zumindest bis der Garbage Collector aufräumt,
    was aber einige Zeit dauern kann und so kommt der Fehler.

    Besser wäre die Verwendung von using:

            Dim filenamefullpath As String = frm_hauptmaske.text_textfilenamefullpath.Text
            Using writer As New StreamWriter(filenamefullpath)
                writer.WriteLine(frm_hauptmaske.text_textfilechangedcontent.Text)
            End Using
    
            Dim inhalt As String = ""
            Using reader As New StreamReader(filenamefullpath)
                Dim zeile = reader.ReadLine()
                Do While zeile IsNot Nothing
                    Dim position = zeile.IndexOf("@"c)
                    If position < 0 Then
                        Console.WriteLine("Erwischt")
                    End If
                    inhalt &= Microsoft.VisualBasic.ControlChars.CrLf & zeile
    
                    zeile = reader.ReadLine()
                Loop
            End Using
            frm_hauptmaske.text_textfilenewcontent.Text = inhalt

    Auf die "var_" Präfixe habe ich verzichtet, die sind überflüssig wie ein "weißer Schimmel" ;)
    Wo möglich sollte man die eingebauten Methoden vorziehen, so ist ein IndexOf hier einem InStr gleichwertig.

    Gruß Elmar

    Donnerstag, 8. November 2012 08:19

Alle Antworten

  • Bei allen Objekten, die ein Dispose vorsehen, sollte das Dispose auch genutzt werden. Im Dispose werden z.B. Datei-Handle freigegeben. Am einfachste ist die Nutzung von Using, was ein Dispose impliziert.
     
    --
    Viele Gruesse
    Peter
    Donnerstag, 8. November 2012 07:59
  • Hallo Thomas,

    Du machst zwei Reader auf:

         Dim var_streamreader As New System.IO.StreamReader(var_filenamefullpath)
            var_streamreader = IO.File.OpenText(var_filenamefullpath)

    Die erste Zeile erzeugt einen StreamReader über den Konstruktor,
    die zweite verwendet OpenText - was im Hintergrund ebenfalls einen StreamReader erzeugt.

    Da Du die erste Instanz einfach "vergisst", bleibt sie offen - zumindest bis der Garbage Collector aufräumt,
    was aber einige Zeit dauern kann und so kommt der Fehler.

    Besser wäre die Verwendung von using:

            Dim filenamefullpath As String = frm_hauptmaske.text_textfilenamefullpath.Text
            Using writer As New StreamWriter(filenamefullpath)
                writer.WriteLine(frm_hauptmaske.text_textfilechangedcontent.Text)
            End Using
    
            Dim inhalt As String = ""
            Using reader As New StreamReader(filenamefullpath)
                Dim zeile = reader.ReadLine()
                Do While zeile IsNot Nothing
                    Dim position = zeile.IndexOf("@"c)
                    If position < 0 Then
                        Console.WriteLine("Erwischt")
                    End If
                    inhalt &= Microsoft.VisualBasic.ControlChars.CrLf & zeile
    
                    zeile = reader.ReadLine()
                Loop
            End Using
            frm_hauptmaske.text_textfilenewcontent.Text = inhalt

    Auf die "var_" Präfixe habe ich verzichtet, die sind überflüssig wie ein "weißer Schimmel" ;)
    Wo möglich sollte man die eingebauten Methoden vorziehen, so ist ein IndexOf hier einem InStr gleichwertig.

    Gruß Elmar

    Donnerstag, 8. November 2012 08:19
  • Hallo, besten Dank,

    das mit den zwei Readern habe ich verstanden und haben den ersten Reader jetzt weggelassen. Jetzt geht es ohne Probleme. Das mit USING werde ich heute nachmittag mal testen.

    Vielen Dank Ihr Beiden,

    Gruß

    Thomas

    Donnerstag, 8. November 2012 10:03
  • Hallo Elmar,

    leider ist Dein Beispiel so nicht lauffähig, jedenfalls nicht bei mir. Ist aber nicht schlimm, ich weiß jetzt, dass ich nicht zwei Reader und zwei Writer öffnen darf.

    Gruß

    Thomas

    Donnerstag, 8. November 2012 12:22