En mi aplicación, el usuario puede ingresar un nombre de archivo. Antes de procesar, me gustaría comprobar si la cadena de entrada es un nombre de archivo válido en Windows Vista.
¿Cuál es la forma más sencilla de hacerlo?
Por válido me refiero a legal y no existente
Respuestas:
Compruebe si
filename.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0
y!File.Exists(Path.Combine(someFolder, filename))
fuente
"http://www.microsoft.com/"
pasa la prueba, pero no es un nombre de archivo válido, lo mismo para"::::"
Contrastar
GetInvalidFileNameChars()
:var isValid = !string.IsNullOrEmpty(fileName) && fileName.IndexOfAny(Path.GetInvalidFileNameChars()) < 0 && !File.Exists(Path.Combine(sourceFolder, fileName));
fuente
"http://www.microsoft.com/"
pasa la prueba, pero no es un nombre de archivo válido, lo mismo para"::::"
::::
se consideró incorrectamente válido. He corregido la respuesta para indicar en< 0
lugar de== 0
.GetInvalidFileNameChars
, noGetInvalidPathChars
como SLaks. Siempre que sea una prueba solo para el nombre de archivo y no para un nombre de archivo con ruta, estará bien.GetInvalidFileNameChars
:-)Si se va a crear el archivo, debe utilizar un cuadro de diálogo de archivo para especificar la ruta del directorio. Hay una breve lista de caracteres ilegales para los nombres de archivo.
La única forma verdaderamente confiable de saber si un nombre de archivo es aceptable es probarlo. Los permisos son un pantano.
fuente
Yo uso esto:
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; }
Debería ocuparse de todo menos de nombres reservados, permisos y restricciones de longitud. Esto acepta nombres de archivo relativos y absolutos.
fuente
Esto es solo una idea. Uno debe completar la lista de excepciones:
public static bool IsValidFilename(string filename) { try { File.OpenRead(filename).Close(); } catch (ArgumentException) { return false; } catch (Exception) { } return true; }
fuente