Fehler bei For-Each-Schleife und Auslesen einer Datei ...

  • VB.NET

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

    Fehler bei For-Each-Schleife und Auslesen einer Datei ...

    Hallo Leute,

    nerve euch schon wieder ...

    Also, ich wollte eigentlich, dass die folgende Schleife jede Textdatei deren 3. Zeile ausliest in einem Ordner und zu einer ListView hinzufügt.

    Das ist mein Code:

    VB.NET-Quellcode

    1. For Each items As String In IO.Directory.GetFiles("folder")
    2. Dim item = ListView1.Items.Add(IO.File.ReadAllLines(items)(1))
    3. item.SubItems.Add(IO.File.ReadAllLines(items)(1))
    4. Next


    Dabei kommt die Fehlermeldung heraus:

    "Der Index war außerhalb des Arraybereichs."

    Und die Exception im Direktfenster:

    Eine Ausnahme (erste Chance) des Typs "System.IndexOutOfRangeException" ist in DataQuestion.exe aufgetreten.

    Leider werde ich aus der Fehlermeldung nicht so schlau, hab auch shcon bei den Referenzen hineingeschaut, hat mir aber wegen der Fehlermeldung nichts gebracht.

    Ich hoffe, ihr erkennt den Fehler.

    Vielen Dank im Voraus,
    lg Epic
    Mach es am besten so.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Dim file As String = Nothing
    4. Dim files() As String = Nothing
    5. Dim inhalt() As String = Nothing
    6. Dim lvwitem As ListViewItem = Nothing
    7. files = IO.Directory.GetFiles(IO.Path.Combine(Application.StartupPath, "folder"))
    8. For Each file In files
    9. inhalt = IO.File.ReadAllLines(file)
    10. If (inhalt.Length > 1) Then
    11. lvwitem = Me.ListView1.Items.Add(inhalt(1))
    12. End If
    13. Next
    14. End Sub
    15. End Class
    Hallo,

    danke! - hat funktioniert!
    Nun will ich jedoch das gleiche mit einer Art Anmeldesystem machen.
    Dabei weren die Nutzerdaten (ich weiß, unsicher) in einer Textdatei gespeichert.
    Nun soll ausgelesen werden, wenn der Text aus Textbox1 des gleichen wie in einer der Textdateien im Ordner "users" in Zeile 0 (also 1) genau gelich entspricht und das Passwort ebenfalls, das etwas passieren sollte. Ich hatte schoneinmal ein Grundgerüst,dass leider nicht funktioniert hatte, nun habe ich einen ähnlichen (eiegtnllcih den selben) Code wie oben benützt:

    " Dim file As String = Nothing
    Dim files() As String = Nothing
    Dim inhalt() As String = Nothing
    Dim true1 As Integer
    Dim true2 As Integer
    Dim int_together As Integer
    true1 = 0
    true2 = 0
    int_together = 0
    files = IO.Directory.GetFiles(IO.Path.Combine(Application.StartupPath, "users"))

    For Each file In files

    inhalt = IO.File.ReadAllLines(file)

    If (inhalt.Length > 1) Then

    If inhalt(0) = TextBox1.Text Then
    true1 = 1
    Else
    true1 = 0
    End If
    If inhalt(1) = TextBox2.Text Then
    true2 = 1
    Else
    true2 = 0
    End If
    MsgBox(inhalt(0))

    End If

    Next"

    Ich habe einen Denkfehler drinnen, den es wird ja für jeden Ordner das geliche ausgegeben. Wie könnte ich da smachen, damit es funktioniert?

    Epic schrieb:

    den es wird ja für jeden Ordner das geliche ausgegeben

    Was heisst das ? Es wird die 1.Zeile jedes Files (User) mit TextBox1.Text verglichen und die 2.Zeile (PW) mit TextBox2.Text, was passt da nicht ?

    Ein paar Bemerkungen zu dem etwas umständlichen Code:
    - wozu diese Integer True1, True2 statt echte Boolsche Variablen ?
    - Wozu diesen leicht aufgeblähten Code mit Deklaration und Instanzieren der Variablen am Anfang ?
    - eine Filterung auf "*.txt" oder sonstiges beit GetFiles wäre evtl sinnvoll - oder ?
    - benutze doch beim Posten von Code das VB Tag

    Dein Code ist etwas kürzer gefasst das Gleiche wie:

    VB.NET-Quellcode

    1. ' files holen
    2. Dim files As String() = IO.Directory.GetFiles(IO.Path.Combine(Application.StartupPath, "users"))
    3. ' jeden file prüfen
    4. For Each file As String In files
    5. Dim inhalt As String() = IO.File.ReadAllLines(file)
    6. If (inhalt.Length > 1) Then
    7. Dim UserOK As Boolean = (inhalt(0) = TextBox1.Text)
    8. Dim pwOK As Boolean = (inhalt(1) = TextBox2.Text)
    9. ' ausgabe des Ergebnis
    10. Trace.WriteLine(file & " : Vergleich ergab " & (UserOK And pwOK).ToString)
    11. MsgBox(inhalt(0))
    12. End If
    13. Next

    oder noch kürzer

    VB.NET-Quellcode

    1. ' files holen
    2. Dim files As String() = IO.Directory.GetFiles(IO.Path.Combine(Application.StartupPath, "users"))
    3. ' jeden file prüfen
    4. For Each file As String In files
    5. Dim inhalt As String() = IO.File.ReadAllLines(file)
    6. Dim checkOk As Boolean = (inhalt.Length > 1) AndAlso (inhalt(0) = TextBox1.Text) AndAlso (inhalt(1) = TextBox2.Text)
    7. ' ausgabe des Ergebnis
    8. Trace.WriteLine(IO.Path.GetFileName(file) & " : Vergleich ergab " & checkOk.ToString)
    9. Next

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kangaroo“ ()