2009-06-26 25 views
49

¿Cuál es la mejor manera de combinar una ruta con un nombre de archivo?¿Cuál es la mejor manera de combinar una ruta y un nombre de archivo en C# /. NET?

Es decir, dado c:\foo y bar.txt, quiero c:\foo\bar.txt.

Dada c:\foo y ..\bar.txt, quiero ya sea un error o c:\foo\bar.txt (por lo que no pueden utilizar directamente Path.Combine()). Del mismo modo para c:\foo y bar/baz.txt, quiero un error o c:\foo\baz.txt (no c:\foo\bar\baz.txt).

Me doy cuenta, podría verificar que el nombre del archivo no contenga '\' o '/', pero ¿es eso suficiente? Si no, ¿cuál es el cheque correcto?

Respuesta

83

Si desea "malos" los nombres de archivo a generará un error:

if (Path.GetFileName(fileName) != fileName) 
{ 
    throw new Exception("'fileName' is invalid!"); 
} 
string combined = Path.Combine(dir, fileName); 

O, si lo que desea es "malo" nombres de archivo en silencio correctas sin lanzar un ex cepción:

string combined = Path.Combine(dir, Path.GetFileName(fileName)); 
+9

Para aquellos menos familiarizados con el marco, necesita una llamada 'using System.IO;' en su archivo para obtener acceso a 'Path'. –

+2

Tenga en cuenta que 'Path.Combine' lanzará' ArgumentNullException' si cualquiera de sus argumentos es 'null'. ** Puede ** pasar una cadena vacía al argumento –

+2

Nota: Path.Combine normalmente agregará un separador entre cada ruta, si es necesario. Sin embargo, Path.Combine ("C:", "file.txt"), devuelve "C: file.txt", que no es una ruta válida. – ConditionRacer

16

que puede usar:

Path.Combine(folder, Path.GetFileName(fileName)) 

o, para saltar hacia fuera el \ (no probado, tal vez el Path.GetFileName maneja esto automáticamente)

Path.Combine(folder, Path.GetFileName(fileName.Replace("/","\\"))) 
+4

¡Gracias! Solo FYI: el reemplazo no es necesario. –

1

Tenga en cuenta que cuando se utiliza Path.Combine(arg1, arg2) - si su usuario introduce una ruta de archivo completo para arg2 se tendrá en cuenta arg1, arg2 y utilizar como el camino.

En mi opinión, Microsoft jodió allí! Esto puede dejarlo abierto con el usuario pirateando todo su sistema de archivos. ¡Ten cuidado, lee la letra pequeña! Si está combinando rutas use: var newPath = path1 + @"\" + path2; más simple y sin resultados inesperados ...

+0

Una ruta completa en el lado derecho que se devuelve como resultado de combinar rutas relativas es un resultado correcto y válido. –

+1

Independientemente de si es un resultado correcto y válido, a demasiados desarrolladores les falta el hecho de que si en su código arg1 es una ruta de carpeta y arg2 es la entrada del usuario, el resultado será una ruta de acceso absoluta arg2. Hace que sea muy fácil abrirse, en mi opinión, lo peor de los ataques a la aplicación web ... la inyección de códigos/proyectiles ... Verifique su entrada chicos. – Cyassin

+0

En mi opinión, cualquier desarrollador que piense que está bien permitir que un usuario ingrese las rutas sin verificación alguna, merece ser pirateado. Este es el primer día y Path.Combine no está diseñado para funcionar de la forma que usted cree que debería: es una forma decente y robusta de evitar tener que verificar la barra diagonal inversa del terminal, que en realidad está destinada para uso interno de su código. no como una interfaz para proteger sus archivos. La documentación es bastante completa, solo léala. – jinzai

Cuestiones relacionadas