2008-09-19 16 views
19

¿Qué es una buena expresión regular que puede validar una cadena de texto para asegurarse de que es un nombre de archivo válido de Windows? (AKA no tiene \/:*?"<>| caracteres).Las expresiones regulares en C# para la validación de nombre de archivo

me gustaría usarlo como el siguiente:

// Return true if string is invalid. 
if (Regex.IsMatch(szFileName, "<your regex string>")) 
{ 
    // Tell user to reformat their filename. 
} 

Respuesta

48

Como ya se respondió, GetInvalidFileNameChars deben hacerlo por usted, y usted ni siquiera necesitan la sobrecarga de expresiones regulares:

if (proposedFilename.IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) != -1) 
{ 
    MessageBox.Show("The filename is invalid"); 
    return; 
} 
+0

simple right parenthesy error de colocación en la declaración if, pero gracias increíble! – Balk

+7

Entonces, "C ::::::::" es un nombre de archivo válido? – Andrew

+0

Andrew: no, esto es solo una revisión básica aproximada para los personajes ... Hay muchas otras razones para acceder a un archivo con 'proposalFilename' puede fallar: archivo (no existe), solo lectura, ruta demasiado larga, directorio doesn 't exist, el nombre es dos archivos del dispositivo (como' nul 'o' prn ') etc. –

0

Por qué no usar la clase System.IO.FileInfo, junto con la clase DirectoryInfo usted tiene un conjunto de métodos útiles.

6

Esto no es tan simple como comprobar si el nombre de archivo contiene ningún de System.IO.Path.GetInvalidFileNameChars (como se menciona en un par de otras respuestas ya).

Por ejemplo, si alguien ingresa un nombre que no contiene caracteres inválidos pero tiene 300 caracteres (es decir, mayor que MAX_PATH) - esto no funcionará con ninguna de las API de archivos .NET, y solo tiene soporte limitado en el resto de ventanas usando la sintaxis \? \ path. Necesita contexto en cuanto a la duración del resto de la ruta para determinar cuánto tiempo puede ser el nombre del archivo. Puede encontrar more information about this type of thing here.

En última instancia, todos sus cheques pueden confiablemente hacer es comprobar que el nombre de un archivo no es válido, o darle una estimación razonable de si es válido. Es virtualmente imposible probar que el nombre del archivo es válido sin realmente intentar usarlo. (E incluso entonces tiene problemas como si ya existe? Puede ser un nombre de archivo válido, pero ¿es válido en su escenario tener un nombre duplicado?)

0

Path.GetInvalidFileNameChars - No es una buena manera. Pruebe esto:

if(@"C:\A.txt".IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) != -1) 
{ 
    MessageBox.Show("The filename is invalid"); 
    return; 
} 
+0

Depende de lo que quiera lograr. Vine aquí desde una consulta de Google y quiero verificar solo los nombres de archivo válidos (no una ruta completa) y estoy bastante seguro de que no se puede tener un archivo llamado "c: \ a.txt" dentro de una carpeta;) –

+0

Sí, para comprobar sólo el nombre de los archivos Path.GetInvalidFileNameChars() aceptable, pero convenciones de nomenclatura (http://msdn.microsoft.com/en-us/library/aa365247.aspx#naming_conventions) tienen muchas reglas interesantes. –

Cuestiones relacionadas