2011-01-10 16 views
52

En mi aplicación, el usuario puede ingresar un nombre de archivo. Antes de procesar, me gustaría verificar si la cadena de entrada es un nombre de archivo válido en Windows Vista.La forma más fácil de comprobar si una Cadena arbitraria es un nombre de archivo válido

¿Cuál es la forma más fácil de hacerlo?

Por válida Estoy según los planes de legal y que no existe

+0

Cuando dice nombre de archivo válido, ¿se está refiriendo al hecho de que el archivo existe o está preguntando si el sistema de operaciones lo permite? –

+4

¿Válido como en (a) existente, (b) legal, o (c) legal y no existente? –

+0

Sry debería haber aclarado eso. Debe ser (c) leagl y no existente – RoflcoptrException

Respuesta

91

Compruebe si filename.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0 y !File.Exists(Path.Combine(someFolder, filename))

+1

Compruebe la respuesta de Phil HUnt; parece que InvalidPathChars es una API obsoleta, y debe usar GetInvalidFileNameChars() en su lugar. – GendoIkari

+3

La matriz devuelta por este método no garantiza que contenga el conjunto completo de caracteres que no son válidos en los nombres de archivos y directorios. Además, esa propiedad está en desuso. –

+1

counter-example: '" http://www.microsoft.com/ "' pasa su prueba pero no es un nombre de archivo válido, ídem para '" :::: "' –

26

Comprobar contra GetInvalidFileNameChars():

var isValid = !string.IsNullOrEmpty(fileName) && 
       fileName.IndexOfAny(Path.GetInvalidFileNameChars()) < 0 && 
       !File.Exists(Path.Combine(sourceFolder, fileName)); 
+0

counter-example: '" http://www.microsoft.com/ "' pasa la prueba, pero no es un nombre de archivo válido, ídem para '" :::: "' –

+0

@Ben Voigt: Tiene razón en que ': ::: 'fue incorrectamente considerado como válido. He corregido la respuesta para indicar '<0' en lugar de' == 0'. –

+1

Oh, acabo de notar que estás usando 'GetInvalidFileNameChars', no' GetInvalidPathChars' como SLaks. Siempre que sea una prueba solo para el nombre de archivo y no un nombre de archivo con ruta, estará bien. –

12

Si el archivo va a ser creado, debería usar un diálogo de archivo para especificar la ruta del directorio. Hay una breve lista de caracteres ilegales para los nombres de archivo.

La única manera verdaderamente confiable de saber si un nombre de archivo es aceptable es probarlo. Permisos es un pantano.

+0

El diálogo de archivos es una pista falsa, pero +1 para" solo realmente confiable " forma ... es intentarlo ". –

+1

De acuerdo. Incluso si el nombre de archivo no existe y no contiene caracteres ilegales, existen varias razones por las cuales no se creará el archivo, la más obvia es la falta de permiso de creación para el directorio. –

0

utilizo este:

public static bool IsValidFileName(string name) { 
    if(string.IsNullOrWhiteSpace(name)) return false; 
    if(name.Length > 1 && name[1] == ':') { 
     if(name.Length < 4 || name.ToLower()[0] < 'a' || name.ToLower()[0] > 'z' || name[2] != '\\') return false; 
     name = name.Substring(3); 
    } 
    if(name.StartsWith("\\\\")) name = name.Substring(1); 
    if(name.EndsWith("\\") || !name.Trim().Equals(name) || name.Contains("\\\\") || 
     name.IndexOfAny(Path.GetInvalidFileNameChars().Where(x=>x!='\\').ToArray()) >= 0) return false; 
    return true; 
} 

debe hacerse cargo de todo, menos restricciones nombres, los permisos y la longitud reservadas. Esto acepta nombres de archivo relativos y absolutos.

Cuestiones relacionadas