Wie kann ich eine Zeichenkette zur Verwendung als Dateiname bereinigen?
Ich habe eine routine, die konvertiert eine Datei in ein anderes format und speichert es. Die original datafiles waren gezählt, aber meine routine gibt die Ausgabe einen Dateinamen auf Basis eines internen Namen im original gefunden.
Versuchte ich bei der batch-Ausführung auf ein ganzes Verzeichnis, und es funktionierte gut, bis ich den Treffer einer Datei, deren interner name hatte einen Schrägstrich. Oops! Und wenn es das tut, das hier, es könnte leicht tun es auf andere Dateien. Gibt es ein RTL (oder WinAPI) routine, die irgendwo bereinigen, einen string und entfernen ungültige Symbole, so es sicher ist zu verwenden als Dateiname?
InformationsquelleAutor der Frage Mason Wheeler | 2009-06-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie PathGetCharType FunktionPathCleanupSpec Funktion oder folgender trick:
Dieser code trennt Zeichenkette in Teile und Verwendungen, MoveFile, überprüfen Sie jeden Teil. MoveFile Fehler für ungültige Zeichen oder reservierte Dateinamen (z.B. 'COM') und return Erfolg oder ERROR_ALREADY_EXISTS für gültige Dateinamen.
PathCleanupSpec ist in der Jedi Windows API unter Win32API/JwaShlObj.pas
InformationsquelleAutor der Antwort Alex
Bezüglich der Frage, ob es irgendeine API-Funktion zum bereinigen einer Datei einen Namen (oder auch check für Ihre Gültigkeit) - es scheint keiner zu sein. Zitat aus dem Kommentar auf der PathSearchAndQualify() - Funktion:
So können Sie nur konsultieren Sie die Regeln für Dateinamen Gültigkeit von Dateinamen, - Pfade und-Namespaces (Windows):
Nahezu jedes Zeichen in der aktuellen Codepage für einen Namen, einschließlich Unicode-Zeichen und Zeichen des erweiterten Zeichensatzes (128-255), außer für die folgenden:
< > : "/\ | ? *
Verwenden Sie nicht die folgenden reservierten Gerätenamen, den Namen einer Datei:
CON
PRN
AUX
NUL
COM1..COM9
LPT1..LPT9
.Vermeiden Sie auch diesen Namen unmittelbar gefolgt von einer Erweiterung, zum Beispiel
NUL.txt
wird nicht empfohlen.Wenn Sie wissen, dass Ihr Programm immer nur schreiben auf NTFS Datei-Systemen können Sie wahrscheinlich sicher sein, dass es keine anderen Zeichen, die das Dateisystem nicht erlauben, so würden Sie nur haben, um zu überprüfen, dass der Dateiname nicht zu lang (verwenden Sie die
MAX_PATH
ständige) nachdem alle ungültigen chars entfernt wurden (oder durch Unterstriche ersetzt, zum Beispiel).Programm sollte auch stellen Sie sicher, dass der Dateiname bereinigt hat, nicht dazu führen, dass die Datei-Namen-Konflikte und es automatisch überschrieben andere Dateien, die endete mit dem gleichen Namen.
InformationsquelleAutor der Antwort mghie
InformationsquelleAutor der Antwort Mark Elder
Überprüfen, ob Zeichenfolge ist ungültig chars; Lösung von hier:
Und für Streicher False zurückgeben, Sie könnte tun etwas einfaches wie diese für jedes ungültige Zeichen:
InformationsquelleAutor der Antwort bernie
Für jemand anderes dies Lesen und nutzen wollen, die PathCleanupSpec, schrieb ich diese test-routine, die zu funktionieren scheint... gibt es eine definitiv fehlen von Beispielen auf der 'net.
Sie müssen ShlObj.pas (nicht sicher, wenn PathCleanupSpec wurde Hinzugefügt, aber getestet habe ich diese in Delphi 2010)
Sie müssen auch prüfen, ob XP sp2 oder höher
InformationsquelleAutor der Antwort sergeantKK
Gut, die einfache Sache ist, um einen regex verwenden und Ihre Lieblings-Sprache-version von
gsub
zu ersetzen alles, was nicht ein "Wort-Charakter". Diese Charakter-Klasse wäre "\w
" in den meisten Sprachen mit Perl-wie regexes, oder "[A-Za-z0-9]
" als eine einfache option sonst.Besonders, im Gegensatz zu einigen der Beispiele, die in anderen Antworten, die Sie nicht wollen, zu suchen, die ungültige Zeichen zu entfernen, sondern suchen Sie die gültigen Zeichen, zu halten. Wenn Sie auf der Suche nach ungültigen Zeichen, Sie sind immer anfällig für die Einführung von neuen Charakteren, aber wenn du suchst nur gültig, Sie könnten etwas weniger ineffizient (in, dass Sie ersetzt ein Zeichen, das Sie nicht wirklich benötigt), aber Sie zumindest nie falsch sein.
Nun, wenn Sie wollen, um die neue version so viel wie die alten, wie möglich, sollten Sie Ersatz. Statt Sie zu löschen, können Sie ersetzen ein Zeichen oder Zeichen, die Sie wissen, um ok zu sein. Aber das ist ein ziemlich Interessantes problem, dass es wohl ein gutes Thema für eine andere Frage.
InformationsquelleAutor der Antwort Curt J. Sampson
Habe ich dieses:
InformationsquelleAutor der Antwort John Weldon
Versuchen, diese auf eine moderne delphi:
Ich können auch Deutsche Umlaute und andere Zeichen wie -, _,.. in den Dateinamen.
InformationsquelleAutor der Antwort brenkdar
InformationsquelleAutor der Antwort alitrun