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.Combine
pero 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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top