Ich arbeite an einem Projekt, das eine Funktion hat, die Dateipfade (wie C:/foo1/foo2/foo3.txt) als Strings sammelt, wenn eine Datei mit diesem Pfad vorhanden ist (gefunden über die Dateisystem-Bibliothek).
Auf den ersten Blick sieht das einfach aus, bis ich die Datei sehe Pfade sind oft einfach (in Ermangelung eines besseren Wortes) Vorlagen.
Mein Programm erhält einen Vorlagendateipfad wie diesen:
Code: Select all
C:/User/Documents/%A/%B.txtEs wird nur noch komplizierter, weil wir jetzt zwei weitere Vorlagensymbole hinzufügen: * und ?.
Zum Beispiel:
Code: Select all
C:/User/Documents/*_%A_??_*/%B_*.txtHier steht * für 0 oder mehr Zeichen und ? für ein Zeichen.
Im Beispiel sollte also ein Dateipfad wie: C:/User/Documents/smile_2022_A1_/07_ABCDEFGHIJKLMNOP.txt gefunden und als Zeichenfolge gespeichert werden.
Ich kann trennen den Dateipfad über Tokenisierung, was bedeutet, dass ich bereits eine Funktion habe, die einen Vektor sammelt, der beispielsweise mit C:, foo1, foo2, foo3.txt gefüllt ist. Damit kann ich den Vektor entweder mit einer Schleife durchlaufen oder rekursiv einen Ordner eingeben, bis ich entweder:
- eine Sackgasse erreiche (d. h. der Ordner oder die Datei existiert nicht)
- die gewünschte Datei erreiche und ihren gesamten Pfad als Zeichenfolge speichere
- wenn das * oder ? ein _ enthält
- wenn der Ordner- oder Dateiname einfach kein _ enthält
Der Grund, warum ich keine Regex sage, liegt darin, dass sie meines Wissens nach etwas strenger ist, wenn es um den Vergleich einer Datei geht. Es wird erwartet, dass die Zeichenfolge auf eine bestimmte generische, aber konsistente Weise geschrieben wird. Allerdings kann ich in meinem Fall nicht erwarten, dass ein Benutzer seine Ordner einheitlich benennt...
Mobile version