Mein Programm nimmt beliebige Zeichenfolgen aus dem Internet und verwendet sie für Dateinamen. Gibt es eine einfache Möglichkeit, die fehlerhaften Zeichen aus diesen Zeichenfolgen zu entfernen, oder muss ich dafür eine benutzerdefinierte Funktion schreiben?
92
Antworten:
Ugh, ich hasse es, wenn Leute versuchen zu erraten, welche Zeichen gültig sind. Beide früheren Kommentare waren nicht vollständig portierbar (ich dachte immer an Mono), aber es fehlten mehr als 25 ungültige Zeichen.
quelle
So entfernen Sie ungültige Zeichen:
So ersetzen Sie ungültige Zeichen:
So ersetzen Sie ungültige Zeichen (und vermeiden potenzielle Namenskonflikte wie Hell * vs Hell $):
quelle
Diese Frage wurde gefragt , viele Male vor und, wie oft darauf hingewiesen , vor,
IO.Path.GetInvalidFileNameChars
nicht ausreichend ist.Erstens gibt es viele Namen wie PRN und CON, die reserviert und für Dateinamen nicht zulässig sind. Es gibt andere Namen, die nicht nur im Stammordner zulässig sind. Namen, die in einem Punkt enden, sind ebenfalls nicht zulässig.
Zweitens gibt es eine Vielzahl von Längenbeschränkungen. Lesen Sie die vollständige Liste für NTFS hier .
Drittens können Sie an Dateisysteme mit anderen Einschränkungen anhängen. Beispielsweise können ISO 9660-Dateinamen nicht mit "-" beginnen, sondern diese enthalten.
Viertens, was machen Sie, wenn zwei Prozesse "willkürlich" denselben Namen wählen?
Im Allgemeinen ist die Verwendung von extern generierten Namen für Dateinamen eine schlechte Idee. Ich empfehle, eigene private Dateinamen zu generieren und von Menschen lesbare Namen intern zu speichern.
quelle
Ich stimme Grauenwolf zu und kann das nur empfehlen
Path.GetInvalidFileNameChars()
Hier ist mein C # -Beitrag:
ps - das ist kryptischer als es sein sollte - ich habe versucht, prägnant zu sein.
quelle
Array.ForEach
foreach
Path.GetInvalidFileNameChars().Aggregate(file, (current, c) => current.Replace(c, '-'))
Hier ist meine Version:
Ich bin nicht sicher, wie das Ergebnis von GetInvalidFileNameChars berechnet wird, aber das "Get" legt nahe, dass es nicht trivial ist, also speichere ich die Ergebnisse zwischen. Außerdem wird die Eingabezeichenfolge nur einmal anstatt mehrmals durchlaufen, wie bei den obigen Lösungen, die über den Satz ungültiger Zeichen iterieren und diese einzeln in der Quellzeichenfolge ersetzen. Ich mag auch die Where-basierten Lösungen, aber ich ziehe es vor, ungültige Zeichen zu ersetzen, anstatt sie zu entfernen. Schließlich ist mein Ersatz genau ein Zeichen, um zu vermeiden, dass Zeichen in Zeichenfolgen konvertiert werden, wenn ich über die Zeichenfolge iteriere.
Ich sage alles, ohne das Profiling zu machen - dieses "fühlte" sich einfach gut für mich an. :)
quelle
new HashSet<char>(Path.GetInvalidFileNameChars())
O (n) -Aufzählung vermeiden - Mikrooptimierung.Hier ist die Funktion, die ich jetzt verwende (danke jcollum für das C # -Beispiel):
Ich habe dies der Einfachheit halber in eine "Helfer" -Klasse eingeordnet.
quelle
Wenn Sie schnell alle Sonderzeichen entfernen möchten, die manchmal für Dateinamen besser lesbar sind, funktioniert dies gut:
quelle
\W
mehr als Nicht-Alphanumerik ([^A-Za-z0-9_]
). Alle Unicode-Wortzeichen (русский 中文 ... usw.) werden ebenfalls nicht ersetzt. Aber das ist eine gute Sache..
sodass Sie die Erweiterung zuerst extrahieren und anschließend erneut hinzufügen müssen.quelle
Warum konvertieren Sie den String nicht wie folgt in ein Base64-Äquivalent:
Wenn Sie es zurückkonvertieren möchten, damit Sie es lesen können:
Ich habe dies verwendet, um PNG-Dateien mit einem eindeutigen Namen aus einer zufälligen Beschreibung zu speichern.
quelle
Folgendes habe ich gerade zu der statischen Klasse StringExtensions (Utils.Silverlight-Projekt) von ClipFlair ( http://github.com/Zoomicon/ClipFlair ) hinzugefügt.
quelle
quelle
Ich finde es schnell und einfach zu verstehen:
Dies funktioniert , weil eine
string
istIEnumerable
alschar
Array und es gibt einenstring
Konstruktor String, der eine nimmtchar
Array.quelle
Aus meinen älteren Projekten habe ich diese Lösung gefunden, die seit über 2 Jahren einwandfrei funktioniert. Ich ersetze illegale Zeichen durch "!" Und überprüfe dann, ob es sich um doppelte Zeichen handelt. Verwenden Sie Ihr eigenes Zeichen.
quelle
Viele Antworten schlagen vor, dies zu verwenden,
Path.GetInvalidFileNameChars()
was mir als schlechte Lösung erscheint. Ich empfehle Ihnen, Whitelisting anstelle von Blacklisting zu verwenden, da Hacker immer einen Weg finden, es irgendwann zu umgehen.Hier ist ein Beispiel für Code, den Sie verwenden können:
quelle