FileOpen durch StreamReader ersetzen

  • VB.NET

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

    FileOpen durch StreamReader ersetzen

    Hallo,
    ich war auf der Suche nach einer Möglichkeit ListViews zu speicher und zu laden. Hier auf dem Board hab ich dann dieses Snippet gefunden:

    [VB.NET] ListView Inhalt - Speichern bzw. Laden

    Das Problem ist, dass beim Laden der Listview kein UTF8-Encoding mit FileOpen möglich ist, deshalb würde ich das gerne durch einen StreamReader ersetzen.

    Ich habe also die Zeile:

    VB.NET-Quellcode

    1. FileOpen(1, Path, OpenMode.Input)


    durch

    VB.NET-Quellcode

    1. Dim sr As New IO.StreamReader(Path, System.Text.Encoding.UTF8)
    2. Dim sLine As String = sr.ReadToEnd
    3. sr.Close()


    ersetzt. Dann kommt es jedoch zu dem Fehler in der Zeile mit dem EOF:
    "Der Dateiname oder die Zahl ist ungültig."

    Kann mir da jmd schnell weiterhelfen ?
    Danke =)
    sr.ReadToEnd

    Wenn Du sowieso alles auf einmal liest, dann verwende die System.IO.File-Klasse.
    Die hat Funktionen wie ReadAllLines() oder ReadAllText(). Nimm das, was Du brauchst.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Na den Pfad zur txt-Datei

    Aber uns geht's darum, dass wir sehen, wie der Pfad aussieht. Damit wir sehen, ob da irgendwelche ungültigen Zeichen vorkommen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    So sieht das ganze aus:

    VB.NET-Quellcode

    1. Public Shared Function ListViewLoad(ByRef LstVw As ListView, ByVal Path As String)
    2. If IO.File.Exists(Path) = True Then
    3. Dim sItem() As String
    4. Dim ItemX As ListViewItem
    5. Dim IntCols As Integer
    6. IntCols = LstVw.Columns.Count
    7. Dim sr As New IO.StreamReader(Path, System.Text.Encoding.UTF8)
    8. Dim sLine As String = sr.ReadToEnd
    9. With LstVw.Items
    10. While Not EOF(1)
    11. sItem = Split(sLine, "##--##")
    12. ItemX = .Add(sItem(0), sItem(1))
    13. For i = 2 To IntCols
    14. ItemX.SubItems.Add(sItem(i))
    15. Next i
    16. End While
    17. End With
    18. sr.Close()
    19. End If
    20. End Function



    Und vergesst das mit dem Pfad :D Der stimmt und wird auch korrekt gelesen
    While Not EOF(1)

    Warum vewerndest Du nochmal einen StreamReader, wenn Du eh die VB6-Methoden verwendest?
    Der StreamReader ist dazu da, Dateien Stückweise auszulesen, damit man auch mit großen Datenmengen fertig wird. Der StreamReader hat für Dich keinen Sinn, denn so groß wird die Datei nicht sein. Verwende System.IO.File
    ABER: Um auf den StreamReader einzugehen:
    1. Using sr As New System.IO.StreamReader
    2. Zeile 14 wird umgestaltet: While Not sr.EndOfStream... weil nicht EOF-Funktion verwenden, sondern den StreamReader.
    3. [VB 2010] Böses aus VB6/VB2003 - und die richtigen VB.NET-Alternativen

    Wir vergessen nicht! (Aber jetzt, wo Du uns den ganzen Code gezeigt hast, glauben wir Dir, dass der Pfad OK ist).
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Wenn du das sagst, dann werde ich das auch tun und verwende IO.File. Hab das jetzt mal zum Testen in "While Not sr.EndOfStream" abgeändert. Der Fehler ist jetzt verschwunden aber dafür wird auch die While-Schleife bzw. deren Inhalt garnicht ausgeführt.
    Ich glaube, Dir ist nicht ganz klar, wie man den StreamReader bedient.

    Ich erklär's mal an einem Beispiel:
    In einer Datei hast Du Zahlen abgespeichert. Pro Zeile eine Zahl. (Das Beispiel hat keinen praktischen Sinn. Es soll nur die Funktion des StreamReaders verdeutlichen.)
    Wenn Du jetzt für jede Zahl eine Berechnung durchführen willst, kannst Du die Datei mit einem StreamReader zeilenweise einlesen:

    VB.NET-Quellcode

    1. Using SR As New System.IO.StreamReader("PfadZurDatei", System.Text.Encoding.Default)
    2. Do Until SR.EndOfStream
    3. BerechnungAusführen(Convert.ToInt32(SR.ReadLine))
    4. Loop
    5. End Using

    Der StreamReader wird in Zeile 1 geöffnet, und durch das Using muss man sich nicht mehr um das Schließen kümmern. Sobald der Using-Block verlassen wird, wird der StreamReader automatisch geschlossen und verworfen. Das sollte man mit allem so machen, was die IDisposable-Schnittstelle implementiert (Da gibt's dann eine Funktion .Dispose(). Beispiele wären Forms, Dialoge, Streams oder Bitmaps/Images.).

    Die Schleife wird so lange wiederholt, bis das Ende des dem StreamReader zu Grunde liegenden Streams erreicht wurde. Die EndOfStream-Property gibt dann True zurück.
    Mit anderen Worten: Das Ende der Datei wurde erreicht.

    In Zeile 3 wird SR.ReadLine() aufgerufen. Hier wird eine Zeile aus dem Stream des StreamReaders gelesen und zurückgegeben. Zugleich wird die aktuelle Position im Stream ans Ende der gerade gelesenen Zeile verschoben. Stell es Dir wie einen Stapel aus UNO-Karten vor. Jedes Mal, wenn Du ein Zeichen liest, nimmst Du die oberste Karte vom Stapel und schreibst diesen Wert auf. Danach wirfst Du die Karte weg. ReadLine() liest so lange neue Karten, bis entweder das Ende des Stapels erreicht wurde, oder eine gewisse Karten-Kombination (nämlich ein Zeilenumbruch) erreicht wird.
    Wenn Du das nächste mal ReadLine() aufrufst, wiederholt sich das.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @davidNando: Ich empfehle Dir, grundsätzlich alle File-Zugriffe, die nsch VB6 aussehen (da wo ein FreeFile-Wert drin vorkommt) zu eliminieren und die System.IO-Klassen zu verwenden.
    Und wenn Du tatsächlich die Datei zeilenweise bis zum Ende ausliest, hat Dir @Niko Ortner: den richtigen Hinweis gegeben: System.IO.File.ReadAllLines() und Du musst Dich nie wieder um ein EOF kümmern.
    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!