Если вы пытаетесь проверить, не содержит ли строка, содержащая ваше имя / путь к файлу, недопустимые символы, самый быстрый способ, который я нашел, - это использовать Split()
для разбиения имени файла на массив частей, где есть недопустимый символ. Если результатом является только массив 1, недопустимые символы отсутствуют. :-)
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;
Я попытался запустить этот и другие методы, упомянутые выше, для имени файла / пути 1 000 000 раз в LinqPad.
Использование Split()
составляет всего ~ 850 мс.
Использование Regex("[" + Regex.Escape(new string(System.IO.Path.GetInvalidPathChars())) + "]")
составляет около 6 секунд.
Более сложные регулярные выражения справляются НАМНОГО хуже, как и некоторые другие опции, такие как использование различных методов Path
класса для получения имени файла и выполнения их внутренней проверки (скорее всего из-за накладных расходов на обработку исключений).
Конечно, не очень часто нужно проверять 1 миллион имен файлов, так что в любом случае для большинства этих методов подходит одна итерация. Но это все еще довольно эффективно и эффективно, если вы ищете только недопустимые символы.