Benutzer mit den meisten Antworten
Zugriff auf Textdateien via VB.NET: Wie schließe ich einen Streamwriter oder Streamreader richtig?

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
- Typ geändert Robert Breitenhofer Montag, 12. November 2012 08:28 Frage
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- Als Antwort markiert Robert Breitenhofer Montag, 12. November 2012 08:30
-
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
- Als Antwort markiert Robert Breitenhofer Montag, 12. November 2012 08:29
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- Als Antwort markiert Robert Breitenhofer Montag, 12. November 2012 08:30
-
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
- Als Antwort markiert Robert Breitenhofer Montag, 12. November 2012 08:29