ungültige Zeichen in einem Rutsch abfangen

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

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von asusdk.

    ungültige Zeichen in einem Rutsch abfangen

    Hallo zusammen.

    Mein Programm erzeugt u.a. auch Dateien, die Benamung kann und soll der User teilweise selbst wählen.
    Ich würde gerne ungültige Zeichen für Dateinamen (siehe Screenshot) mit einem Event abfangen.
    D.h. beim Verlassen einer Textbox soll geprüft werden, ob in dieser Textbox eben eines oder mehrere der Zeichen vorkommen.

    Kann man das in einer Funktion (mit z.B. Boolean-Rückgabe) abfangen? Ich wüsste gerade keinen sinnvollen kurzen weg außer einem
    großen Select Case. Da geht doch bestimmt was mit List(Of Char) und textbox.text.contains irgendeins von den Char?

    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Ups... wohl nicht ordentlich gegoogled.
    Genau sowas hab ich gesucht, danke! ;)

    Edit: doch nicht, was mach' ich falsch? Hab sogar oben System.IO importiert, findet aber nix außer Threading...


    Edit2: hat sich erledigt, mein VisualStudio spinnt wohl rum - besser gesagt die IntelliSense. Wenn ich's ausschreibe dann frisst er das
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „tragl“ ()

    @tragl
    Du kannst dir ein Privates Char-Array machen, in dem alle Chars, die du erlaubst, drin sind.
    Wenn du nun prüfen willst, ob in deinem String nur erlaubte Chars sind, nimmst du diese Funktion, die dir True oder False zurückgibt.

    VB.NET-Quellcode

    1. Private Function CheckForUsualCharacters(ByVal StringToCheck As String) As Boolean
    2. 'I deliberately don't use “IndexOfAny <> (-1)” here because I want to prevent even a single character from being illegal. “IndexOfAny” isn't bothered by illegal characters while one legal character is included in the string.
    3. If StringToCheck Is Nothing Then Return False
    4. Dim cnt As Integer = 1
    5. For i As Integer = 0 To StringToCheck.Length - 1
    6. For j As Integer = 0 To erlaubte_Zeichen.Length - 1
    7. If Not StringToCheck.Chars(i) = erlaubte_Zeichen(j) Then
    8. cnt += 1
    9. If cnt = erlaubte_Zeichen.Length Then
    10. Return False
    11. End If
    12. Else
    13. Exit For
    14. End If
    15. Next
    16. cnt = 0
    17. Next
    18. Return True 'Return true if all elements are allowed.
    19. End Function

    Ich habe absichtlich nicht mit IndexOfAny geprüft, weil das das Gegenteil bewirkt sobald ein erlaubter Char neben sonst illegalen Chars ist, würde True zurückgegeben.

    Und wenn du vor lauter Menge den Überblick verloren hast:

    VB.NET-Quellcode

    1. erlaubte_Zeichen = erlaubte_Zeichen.Distinct().ToArray() ' entfernt mehrfach vorkommende Chars aus dem Array.
    :thumbup:

    Bartosz schrieb:

    Du kannst dir ein Privates Char-Array machen, in dem alle Chars, die du erlaubst, drin sind.

    Wär das nicht einfacher mit einer Liste der unerlaubten? und die gegenprüfen?
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Naja, kommt darauf an, was überwiegt. Ich habe zum beispiel ein Char-Array, welches lateinische Buchstaben (A-Z, a-z), polnische Buchstaben (ą) und ein paar Zeichen (._ – -) enthält. Alle anderen Zeichen ( / \ = * # ' und so weiter, russische Buchstaben) versagen bei der Prüfung.

    Bilder
    • Screenshot 2021-11-16 165718.png

      3,06 kB, 276×104, 131 mal angesehen
    • Screenshot 2021-11-16 165734.png

      3,23 kB, 303×108, 37 mal angesehen
    Hab's jetzt mal wie folgt gebaut und werd's mal durchtesten:

    VB.NET-Quellcode

    1. <Extension>
    2. Public Function IsValidFileName(name As String) As Boolean
    3. If name Is Nothing OrElse name = "" Then
    4. msgExclamation("kein Name angegeben!")
    5. Return False
    6. End If
    7. For Each badChar As Char In Path.GetInvalidFileNameChars
    8. If name.Contains(badChar) Then
    9. msgExclamation($"{badChar} darf nicht in einem Dateinamen vorkommen!")
    10. Return False
    11. End If
    12. Next
    13. Return True
    14. End Function
    15. <Extension>
    16. Public Function IsValidFolderName(name As String) As Boolean
    17. If name Is Nothing OrElse name = "" Then
    18. msgExclamation("kein Name angegeben!")
    19. Return False
    20. End If
    21. For Each badChar As Char In Path.GetInvalidPathChars
    22. If name.Contains(badChar) Then
    23. msgExclamation($"{badChar} darf nicht in einem Ordnenamen vorkommen!")
    24. Return False
    25. End If
    26. Next
    27. Return True
    28. End Function
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    VB.NET-Quellcode

    1. Private Function ContainsIllegalFilePathCharacters(TextToCheck As String) As Boolean
    2. Dim IllegalChars = IO.Path.GetInvalidFileNameChars.ToList
    3. IllegalChars.AddRange(IO.Path.GetInvalidPathChars)
    4. Return IllegalChars.Any(Function(x) TextToCheck.Contains(x))
    5. End Function
    Als Extension wird's natürlich noch intuitiver.
    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.
    Oder mit Regex

    Consolen Testprogramm

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Imports System.Text.RegularExpressions
    4. Module Module1
    5. Sub Main()
    6. Dim t As String = " abc:xy"
    7. Dim Treffer As Boolean = False
    8. Dim rx As New Regex("[\\/:*?""><]")
    9. Treffer = rx.IsMatch(t)
    10. If Treffer Then
    11. Debug.Print("Unzulässige Zeichen")
    12. Else
    13. Debug.Print("OK")
    14. End If
    15. End Sub
    16. End Module
    Hab bei mir die Regex Lösung in Verwendung: docs.microsoft.com/de-de/dotne…-characters-from-a-string

    Seit dem ist Ruhe. Die filtert alles raus was Probleme macht. Auch versteckte Zeichenund so Zeug fliegt raus.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    zum testen ob der Dateiname passt benutze ich immer RegEx, wie auch von mrMo erwähnt:

    VB.NET-Quellcode

    1. Public Function ValidateFileNames(value As String) As Boolean
    2. If String.IsNullOrEmpty(value) Then Return False
    3. If value IsNot Nothing AndAlso System.Text.RegularExpressions.Regex.IsMatch(value.ToString, "[\\/:*?""<>|\r\n]") Then
    4. Return False
    5. End If
    6. Return True
    7. End Function


    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    @asusdk Ich würde das so machen:

    VB.NET-Quellcode

    1. Public Function ValidateFileNames(value As String) As Boolean
    2. If String.IsNullOrEmpty(value) Then Return False
    3. Return Not System.Text.RegularExpressions.Regex.IsMatch(value, "[\\/:*?""<>|\r\n]")
    4. End Function
    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!
    @RodFromGermany
    Ich würde das so machen:​


    Ah, ja das ist in dem Fall besser, merk ich mir, danke, hatte es nur schnell so von der ValidationRule die ich immer in WPF verwende umgebastelt ^^ aber zur direkten Stringprüfung sieht deins einfach klarer strukturiert aus, das behalt ich im Hinterkopf
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If