Creación de una cadena de directorio a partir de componentes en C #
-
02-07-2019 - |
Pregunta
Si tengo muchos nombres de directorio como cadenas literales o contenidas en variables, ¿cuál es la forma más fácil de combinarlas para crear una ruta completa?
Sé de
Path.Combinepero esto solo toma 2 parámetros de cadena, necesito una solución que pueda tomar cualquier número de parámetros de directorio.
por ejemplo:
string folder1 = "foo"; string folder2 = "bar"; CreateAPath("C:", folder1, folder2, folder1, folder1, folder2, "MyFile.txt")
¿Alguna idea? ¿C # admite argumentos ilimitados en métodos?
Solución
¿C # admite argumentos ilimitados en métodos?
Sí, eche un vistazo a la palabra clave params. Facilitará la escritura de una función que solo llame a Path. Combine la cantidad adecuada de veces, como esto (sin probar):
string CombinePaths(params string[] parts) {
string result = String.Empty;
foreach (string s in parts) {
result = Path.Combine(result, s);
}
return result;
}
Otros consejos
LINQ al rescate de nuevo. La función de extensión Aggregate se puede usar para lograr lo que desea. Considera este ejemplo:
string[] ary = new string[] { "c:\\", "Windows", "System" };
string path = ary.Aggregate((aggregation, val) => Path.Combine(aggregation, val));
Console.WriteLine(path); //outputs c:\Windows\System
Prefiero usar DirectoryInfo en lugar de los métodos estáticos en Directory, porque creo que es mejor el diseño OO. Aquí hay una solución con métodos de extensión DirectoryInfo +, que creo que es muy agradable de usar:
public static DirectoryInfo Subdirectory(this DirectoryInfo self, params string[] subdirectoryName)
{
Array.ForEach(
subdirectoryName,
sn => self = new DirectoryInfo(Path.Combine(self.FullName, sn))
);
return self;
}
No me encanta el hecho de que estoy modificando self
, pero para este método corto, creo que es más limpio que crear una nueva variable.
El sitio de llamadas lo compensa, sin embargo:
DirectoryInfo di = new DirectoryInfo("C:\\")
.Subdirectory("Windows")
.Subdirectory("System32");
DirectoryInfo di2 = new DirectoryInfo("C:\\")
.Subdirectory("Windows", "System32");
Agregar una forma de obtener FileInfo se deja como ejercicio (¡para otra pregunta SO!).
Prueba este:
public static string CreateDirectoryName(string fileName, params string[] folders)
{
if(folders == null || folders.Length <= 0)
{
return fileName;
}
string directory = string.Empty;
foreach(string folder in folders)
{
directory = System.IO.Path.Combine(directory, folder);
}
directory = System.IO.Path.Combine(directory, fileName);
return directory;
}
Los parámetros lo hacen para que puedas agregar una cantidad infinita de cadenas.
Path.Combine lo hace es asegurarse de que las cadenas ingresadas no comiencen con barras o terminen con ellas y verifiquen si hay caracteres no válidos.