Jeśli próbujesz tylko sprawdzić, czy ciąg zawierający nazwę / ścieżkę pliku zawiera nieprawidłowe znaki, najszybszą metodą, jaką znalazłem, jest Split()podzielenie nazwy pliku na tablicę części, gdziekolwiek jest nieprawidłowy znak. Jeśli wynik jest tylko tablicą 1, nie ma nieprawidłowych znaków. :-)
var nameToTest = "Best file name \"ever\".txt";
bool isInvalidName = nameToTest.Split(System.IO.Path.GetInvalidFileNameChars()).Length > 1;
var pathToTest = "C:\\My Folder <secrets>\\";
bool isInvalidPath = pathToTest.Split(System.IO.Path.GetInvalidPathChars()).Length > 1;
Próbowałem uruchomić tę i inne metody wymienione powyżej na nazwie pliku / ścieżki 1000000 razy w LinqPad.
Używanie Split()trwa tylko ~ 850 ms.
Użycie Regex("[" + Regex.Escape(new string(System.IO.Path.GetInvalidPathChars())) + "]")trwa około 6 sekund.
Bardziej skomplikowane wyrażenia regularne są DUŻO gorzej, podobnie jak niektóre inne opcje, takie jak użycie różnych metod Pathklasy w celu uzyskania nazwy pliku i umożliwienia ich wewnętrznej walidacji (najprawdopodobniej z powodu narzutu obsługi wyjątków).
To prawda, że niezbyt często trzeba sprawdzać poprawność 1 miliona nazw plików, więc i tak pojedyncza iteracja jest odpowiednia dla większości tych metod. Ale nadal jest dość wydajny i skuteczny, jeśli szukasz tylko nieprawidłowych znaków.