"Illegales Zeichen im Pfad" bei fast jedem Eintrag?!

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

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von slice.

    "Illegales Zeichen im Pfad" bei fast jedem Eintrag?!

    Hallo liebe Community!

    Ich habe ein Problem in VB.NET. Ich habe eine Listbox,in der verschiedene Sachen eingetragen sind. Diese Items werden in einer .dat Datei festgehalten. Dazu werden Texte in einer .txt Datei abgespeichert. Wenn ich jetzt aber 2 verschiedene Items habe,kann ich nur den Text des ersten Items öffnen,bei den anderen nicht. Bei den anderen Items kommt eine Fehlermeldung namens "Illegales Zeichen im Pfad". Das kann aber nicht sein,da eins "etwas" und das andere "Test" hieß. Was kann man da tun?

    Informationen über das Aufrufen von JIT-Debuggen
    anstelle dieses Dialogfelds finden Sie am Ende dieser Meldung.
    Dies ist die Fehlermeldung:

    ************** Ausnahmetext **************
    System.ArgumentException: Illegales Zeichen im Pfad.
    bei System.IO.Path.CheckInvalidPathChars(String path, Boolean checkAdditional)
    bei System.IO.Path.GetFileName(String path)
    bei System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize, Boolean checkHost)
    bei System.IO.StreamReader..ctor(String path)
    bei GSave_Final.Form1.ListBox1_SelectedIndexChanged(Object sender, EventArgs e) in I:\repos\GSave Final\GSave Final\Form1.vb:Zeile 25.
    bei System.Windows.Forms.ListBox.OnSelectedIndexChanged(EventArgs e)
    bei System.Windows.Forms.ListBox.WmReflectCommand(Message& m)
    bei System.Windows.Forms.ListBox.WndProc(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    Meine Glaskugel sagt: Du hast ein nicht zulässiges Zeichen in dem Pfad
    Setz ein Breakpoint und schau was in deiner Variable steht: Debuggen, Fehler finden und beseitigen
    Willkommen im Forum.
    Ich blick's nicht. Du hast ne ListBox. Da sind Items drin.
    Was meinst Du mit

    AnyDoge schrieb:

    Diese Items werden in einer .dat Datei festgehalten.
    Wie hält man ListBox-Items in ner Datei fest?

    AnyDoge schrieb:

    Dazu werden Texte in einer .txt Datei abgespeichert.
    Was hat das mit der ListBox zu tun? Oder hast Du in der ListBox die Dateipfade gespeichert?
    Du kannst den Text des ersten Items öffnen. Was meinst Du damit? Meinst Du damit, dass Du, wenn Du ein ListBox-Item anklickst, dass sich dann die Datei öffnet, die als Pfad in dem ListBox-Item hinterlegt ist?
    Sollte das alles zutreffen, dann: Wie erhalten die Items ihren Inhalt? Mit welchem Code? Und: Schau mal nebenbei hier in folgenden Thread rein: keine Strings in die File-ListBox.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @slice Ich habe da nichts gefunden,was funktioniert hat.

    @VaporiZed Das wirst du im Code sehen.

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Text
    3. Public Class Form1
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Using Ready As New IO.StreamReader(Application.StartupPath & "\Daten\Liste.dat", True)
    6. Dim anyt() As String = Ready.ReadToEnd.Split(vbNewLine)
    7. ListBox1.Items.AddRange(anyt)
    8. End Using
    9. End Sub
    10. Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
    11. Dim Listname As String
    12. TextBox1.Text = ListBox1.SelectedItem
    13. Listname = ListBox1.SelectedItem
    14. TextBox2.Text = Listname
    15. Dim path As String = Application.StartupPath & "\Daten\Texte\" & Listname & ".txt"
    16. Using Texter As New StreamReader(path, FileMode.OpenOrCreate)
    17. Dim GetText As String = Texter.ReadToEnd
    18. RichTextBox1.Text = GetText
    19. End Using
    20. Try
    21. PictureBox1.Image = Image.FromFile(Application.StartupPath & "\Daten\Bilder\" & Listname & ".png")
    22. Catch ex As Exception
    23. End Try
    24. End Sub
    25. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    26. Neu.Show()
    27. Hide()
    28. End Sub
    29. Private Sub SaveText()
    30. Try
    31. Dim Listname As String
    32. Listname = TextBox1.Text
    33. My.Settings.Textablage = RichTextBox1.Text
    34. My.Computer.FileSystem.WriteAllText(Application.StartupPath & "\Daten\Texte\" & Listname & ".txt", My.Settings.Textablage, False)
    35. My.Settings.Textablage = ""
    36. Catch ex As Exception
    37. End Try
    38. End Sub
    39. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    40. End Sub
    41. Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
    42. Dim path As String = Application.StartupPath & "\Daten\Texte\" & ListBox1.SelectedItem & ".txt"
    43. Dim fs As FileStream = File.Create(path)
    44. My.Settings.Textablage = RichTextBox1.Text
    45. Dim info As Byte() = New UTF8Encoding(True).GetBytes(My.Settings.Textablage)
    46. fs.Write(info, 0, info.Length)
    47. fs.Close()
    48. End Sub
    49. End Class

    TextBox2 und PictureBox sind unwichtig!
    Ich frag mich (und auch Dich), was rauskommt, wenn Du erstmal Option Strict On machst und statt den Streams einfach IO.File.ReadAllLines bzw. IO.File.WriteAllLines verwendest (korrektes Encoding noch einstellen (ich glaub 3. Parameter)).
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Also ich weiß nicht wie das mit IO.File.ReadAllLines funktioniert. Ich kann das nur in einen String() machen,aber die RichTextBox brauchst String. Wie kann ich das umcodieren? Ich habe damit noch nicht viel Erfahrung.
    Für ListBox1.Items.AddRange brauchst Du ein Array, also IO.File.ReadAllLines. Für Deine RichTextBox kannst Du IO.File.ReadAllText nutzen. Da bekommst Du einen einzigen String inkl. Zeilenumbrüche. Eben das, was ne RTB für ihren Text braucht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Für Deine RichTextBox kannst Du IO.File.ReadAllText nutzen. Da bekommst Du einen einzigen String inkl. Zeilenumbrüche. Eben das, was ne RTB für ihren Text braucht.


    Also File.ReadAllLines kannst du auch nutzen, die RichTextBox hat eine Lines-Property, diese aktzeptiert einen String().
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    AnyDoge schrieb:

    Das kann aber nicht sein
    Kann es sein, dass das Item was anderes ist, als wofür Du es hältst?
    Du denkst, es sei ein String, dein Programm denkt, es sei ein Pfad und behandelt es so?
    Wie passiert vom Auswählen bis zur Exception? Welche Tests oder (ggf. falsche) implizite Voraussetzungen werden abgearbeitet (If ... Then)?
    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!
    Ganz ehrlich, anstatt zu raten, würde ich einfach mal in Zeile 22 ein Breakpoint setzten, debuggen und schauen was in path steht.

    Noch dazu am Rande drei Hinweise:
    TryCatch ist ein heißes Eisen
    Path.Combine um Pfadteile zu verbinden
    Option Strict On