Si solo está tratando de verificar si una cadena que contiene su nombre / ruta de archivo tiene caracteres no válidos, el método más rápido que he encontrado es usar Split()
para dividir el nombre del archivo en una matriz de partes donde haya un carácter no válido. Si el resultado es solo una matriz de 1, no hay caracteres no válidos. :-)
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;
Intenté ejecutar este y otros métodos mencionados anteriormente en un nombre de archivo / ruta 1,000,000 de veces en LinqPad.
El uso Split()
es solo ~ 850 ms.
El uso Regex("[" + Regex.Escape(new string(System.IO.Path.GetInvalidPathChars())) + "]")
es de alrededor de 6 segundos.
Las expresiones regulares más complicadas son MUCHO peores, al igual que algunas de las otras opciones, como usar los diversos métodos en la Path
clase para obtener el nombre del archivo y dejar que su validación interna haga el trabajo (muy probablemente debido a la sobrecarga del manejo de excepciones).
De acuerdo, no es muy frecuente que necesite validar 1 millón de nombres de archivo, por lo que una iteración única está bien para la mayoría de estos métodos de todos modos. Pero sigue siendo bastante eficiente y efectivo si solo está buscando caracteres no válidos.