Ich brauche eine robuste und einfache Methode, um unzulässige Pfad- und Dateizeichen aus einer einfachen Zeichenfolge zu entfernen. Ich habe den folgenden Code verwendet, aber er scheint nichts zu bewirken. Was fehlt mir?
using System;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string illegal = "\"M<>\"\\a/ry/ h**ad:>> a\\/:*?\"<>| li*tt|le|| la\"mb.?";
illegal = illegal.Trim(Path.GetInvalidFileNameChars());
illegal = illegal.Trim(Path.GetInvalidPathChars());
Console.WriteLine(illegal);
Console.ReadLine();
}
}
}
GetInvalidFileNameChars()
entfernt Dinge wie: \ etc aus Ordnerpfaden.Path.GetInvalidPathChars()
scheint nicht zu streifen*
oder?
Antworten:
Versuchen Sie stattdessen so etwas;
Aber ich muss den Kommentaren zustimmen, ich würde wahrscheinlich versuchen, mit der Quelle der illegalen Pfade umzugehen, anstatt zu versuchen, einen illegalen Pfad in einen legitimen, aber wahrscheinlich unbeabsichtigten Pfad zu verwandeln.
Bearbeiten: Oder eine potenziell "bessere" Lösung mit Regex.
Dennoch muss die Frage gestellt werden, warum Sie dies überhaupt tun.
quelle
GetInvalidPathChars()
Zeichen zu enthalten, dieGetInvalidFileNameChars()
dies nicht tun würden. Sie übernehmen keine Korrektheit gegenüber "vorzeitiger" Optimierung. Sie verwenden einfach schlechten Code.Die ursprüngliche Frage lautete "Unzulässige Zeichen entfernen":
Möglicherweise möchten Sie sie stattdessen ersetzen:
Diese Antwort war in einem anderen Thread von Ceres , ich mag es wirklich ordentlich und einfach.
quelle
Ich benutze Linq, um Dateinamen zu bereinigen. Sie können dies problemlos erweitern, um auch nach gültigen Pfaden zu suchen.
Aktualisieren
Einige Kommentare weisen darauf hin, dass diese Methode für sie nicht funktioniert. Daher habe ich einen Link zu einem DotNetFiddle-Snippet eingefügt, damit Sie die Methode validieren können.
https://dotnetfiddle.net/nw1SWY
quelle
var invalid = new HashSet<char>(Path.GetInvalidPathChars()); return new string(originalString.Where(s => !invalid.Contains(s)).ToArray())
. Die Leistung ist wahrscheinlich nicht großartig, aber das spielt wahrscheinlich keine Rolle.Sie können illegale Zeichen mit Linq folgendermaßen entfernen:
BEARBEITEN
So sieht es mit der erforderlichen Bearbeitung aus, die in den Kommentaren erwähnt wird:
quelle
Dies sind alles großartige Lösungen, auf die sich jedoch alle verlassen
Path.GetInvalidFileNameChars
, die möglicherweise nicht so zuverlässig sind, wie Sie denken. Beachten Sie die folgende Bemerkung in der MSDN-Dokumentation zuPath.GetInvalidFileNameChars
:Es ist nicht besser mit
Path.GetInvalidPathChars
Methode . Es enthält genau die gleiche Bemerkung.quelle
Für Dateinamen:
Für vollständige Pfade:
Beachten Sie, dass, wenn Sie dies als Sicherheitsfunktion verwenden möchten, ein robusterer Ansatz darin besteht, alle Pfade zu erweitern und dann zu überprüfen, ob der vom Benutzer angegebene Pfad tatsächlich ein untergeordnetes Element eines Verzeichnisses ist, auf das der Benutzer Zugriff haben sollte.
quelle
Für den Anfang entfernt Trim nur Zeichen vom Anfang oder Ende der Zeichenfolge . Zweitens sollten Sie prüfen, ob Sie die anstößigen Zeichen wirklich entfernen möchten oder schnell fehlschlagen möchten, und dem Benutzer mitteilen, dass sein Dateiname ungültig ist. Meine Wahl ist die letztere, aber meine Antwort sollte Ihnen zumindest zeigen, wie man die Dinge richtig und falsch macht:
StackOverflow-Frage, die zeigt, wie überprüft wird, ob eine bestimmte Zeichenfolge ein gültiger Dateiname ist . Beachten Sie, dass Sie den regulären Ausdruck aus dieser Frage verwenden können, um Zeichen mit einem Ersatz für reguläre Ausdrücke zu entfernen (falls Sie dies wirklich tun müssen).
quelle
Der beste Weg, um unzulässige Zeichen aus Benutzereingaben zu entfernen, besteht darin, unzulässige Zeichen mithilfe der Regex-Klasse zu ersetzen, eine Methode im Code dahinter zu erstellen oder sie auf der Clientseite mithilfe des RegularExpression-Steuerelements zu validieren.
ODER
quelle
Ich benutze reguläre Ausdrücke, um dies zu erreichen. Zuerst baue ich den regulären Ausdruck dynamisch.
Dann rufe ich einfach removeInvalidChars.Replace auf, um das Suchen und Ersetzen durchzuführen. Dies kann natürlich auch auf Pfadzeichen ausgedehnt werden.
quelle
new Regex(String.Format("^(CON|PRN|AUX|NUL|CLOCK\$|COM[1-9]|LPT[1-9])(?=\..|$)|(^(\.+|\s+)$)|((\.+|\s+)$)|([{0}])", Regex.Escape(new String(Path.GetInvalidFileNameChars()))), RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.CultureInvariant);
Ich bevorzuge die Idee von Jeff Yates. Es wird perfekt funktionieren, wenn Sie es leicht modifizieren:
Die Verbesserung besteht nur darin, dem automatisch erzeugten regulären Ausdruck zu entkommen.
quelle
Hier ist ein Code-Snippet, das für .NET 3 und höher hilfreich sein sollte.
quelle
Die meisten der oben genannten Lösungen kombinieren unzulässige Zeichen für Pfad und Dateinamen, was falsch ist (selbst wenn beide Aufrufe derzeit denselben Zeichensatz zurückgeben). Ich würde zuerst den Pfad + Dateinamen in Pfad und Dateiname aufteilen, dann den entsprechenden Satz auf einen der beiden anwenden und dann die beiden erneut kombinieren.
wvd_vegt
quelle
Wenn Sie die ungültigen Zeichen entfernen oder durch ein einzelnes Zeichen ersetzen, können Kollisionen auftreten:
Hier ist eine einfache Methode, um dies zu vermeiden:
Das Ergebnis:
quelle
Eine Ausnahme auslösen.
quelle
Ich habe dieses Monster zum Spaß geschrieben, damit kannst du eine Rundreise machen:
quelle
Ich denke, es ist viel einfacher, mit einem regulären Ausdruck zu validieren und anzugeben, welche Zeichen zulässig sind, anstatt zu versuchen, nach allen schlechten Zeichen zu suchen. Siehe diese Links: http://www.c-sharpcorner.com/UploadFile/prasad_1/RegExpPSD12062005021717AM/RegExpPSD.aspx http://www.windowsdevcenter.com/pub/a/oreilly/windows/news/csharp_0101.html
Suchen Sie auch nach "Editor für reguläre Ausdrücke", sie helfen sehr. Es gibt einige, die sogar den Code in c # für Sie ausgeben.
quelle
Dies scheint O (n) zu sein und verbraucht nicht zu viel Speicher für Zeichenfolgen:
quelle
Beim Durchsuchen der Antworten hier scheinen alle ** die Verwendung eines char-Arrays ungültiger Dateinamenzeichen zu beinhalten.
Zugegeben, dies mag eine Mikrooptimierung sein - aber für alle, die eine große Anzahl von Werten auf gültige Dateinamen überprüfen möchten, ist es erwähnenswert, dass das Erstellen eines Hash-Sets ungültiger Zeichen zu einer deutlich besseren Leistung führt.
Ich war in der Vergangenheit sehr überrascht (schockiert), wie schnell ein Hashset (oder Wörterbuch) die Iteration über eine Liste übertrifft. Mit Strings ist es eine lächerlich niedrige Zahl (ungefähr 5-7 Elemente aus dem Speicher). Bei den meisten anderen einfachen Daten (Objektreferenzen, Zahlen usw.) scheint die magische Überkreuzung etwa 20 Elemente zu betragen.
Die "Liste" von Path.InvalidFileNameChars enthält 40 ungültige Zeichen. Habe heute eine Suche durchgeführt und es gibt hier auf StackOverflow einen ziemlich guten Benchmark, der zeigt, dass das Hashset etwas mehr als die Hälfte der Zeit eines Arrays / einer Liste für 40 Elemente benötigt: https://stackoverflow.com/a/10762995/949129
Hier ist die Hilfsklasse, mit der ich Pfade bereinige. Ich vergesse jetzt, warum ich die ausgefallene Ersatzoption darin hatte, aber es ist als süßer Bonus da.
Zusätzliche Bonusmethode "IsValidLocalPath" auch :)
(** diejenigen, die keine regulären Ausdrücke verwenden)
quelle
Sie können die Methode klar anwenden.
quelle
Dateiname kann nicht enthalten Zeichen aus
Path.GetInvalidPathChars()
,+
und#
Symbole und andere spezifische Namen. Wir haben alle Schecks in einer Klasse zusammengefasst:Methode
GetValidFileName
ersetzt alle falschen Daten zu_
.quelle
Ein Liner zum Bereinigen der Zeichenfolge von unzulässigen Zeichen für die Benennung von Windows-Dateien:
quelle
quelle
Dies wird Sie wollen und Kollisionen vermeiden
quelle
Ich denke, die Frage ist bereits nicht vollständig beantwortet ... Die Antworten beschreiben nur den sauberen Dateinamen ODER den Pfad ... nicht beide. Hier ist meine Lösung:
quelle
Ich habe eine Erweiterungsmethode erstellt, die mehrere Vorschläge kombiniert:
Quelle:
quelle
Hier ist eine Funktion, die alle unzulässigen Zeichen in einem Dateinamen durch ein Ersatzzeichen ersetzt:
Zum Beispiel kann der Unterstrich als Ersatzzeichen verwendet werden:
quelle
Oder du kannst es einfach tun
quelle