Якщо ви лише намагаєтеся перевірити, чи містить рядок, що містить ім’я / шлях файлу, недійсні символи, найшвидший спосіб, який я знайшов, - це використовувати 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()
лише ~ 850ms.
Використання Regex("[" + Regex.Escape(new string(System.IO.Path.GetInvalidPathChars())) + "]")
становить близько 6 секунд.
Складніші регулярні вирази справедливі МНОГО гірші, як і деякі інші параметри, як, наприклад, використання різних методів у Path
класі, щоб отримати ім’я файлу та дозволити їхній внутрішній валідації виконати роботу (швидше за все, через накладні витрати на обробку виключень).
Зрозуміло, що не дуже часто вам потрібно перевірити 1 мільйон імен файлів, тому для більшості цих методів одноразово повторюється одна ітерація. Але це все ще досить ефективно і ефективно, якщо ви шукаєте лише недійсних символів.