175 votos

¿Cómo navegar hacia arriba unas cuantas carpetas?

Una opción sería hacer System.IO.Directory.GetParent() unas cuantas veces. ¿Existe una forma más elegante de viajar unas cuantas carpetas hacia arriba desde donde reside la ejecución de la asamblea?

Lo que estoy intentando hacer es encontrar un archivo de texto que reside una carpeta arriba de la carpeta de la aplicación. Pero la propia asamblea está dentro del bin, que está unas cuantas carpetas adentro de la carpeta de la aplicación.

311voto

A-Sharabiani Puntos 5162

Otra forma sencilla es hacer lo siguiente:

string path = @"C:\Folder1\Folder2\Folder3\Folder4";
string newPath = Path.GetFullPath(Path.Combine(path, @"..\..\"));

Nota Esto sube dos niveles. El resultado sería: newPath = @"C:\Folder1\Folder2\";

Nota adicional Path.GetFullPath normaliza el resultado final según el entorno en el que se esté ejecutando el código, ya sea en Windows, Mac, móvil, etc.

49voto

Siby Sunny Puntos 594

Si c:\folder1\folder2\folder3\bin es la ruta entonces el siguiente código devolverá la carpeta base de la carpeta bin

//string directory=System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString());

string directory=System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString();

es decir, c:\folder1\folder2\folder3

si quieres la ruta de la carpeta2 entonces puedes obtener el directorio mediante

string directory = System.IO.Directory.GetParent(System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString()).ToString();

entonces obtendrás la ruta como c:\folder1\folder2\

14voto

DotNetUser Puntos 2204

Puedes usar ..\path para subir un nivel, ..\..\path para subir dos niveles desde path.

También puedes usar la clase Path.

Clase Path de C#

10voto

Jacco Puntos 254

Esto es lo que mejor me funcionó:

string parentOfStartupPath = Path.GetFullPath(Path.Combine(Application.StartupPath, @"../"));

Obtener la ruta 'correcta' no fue el problema, agregar '../' obviamente hace eso, pero después de eso, la cadena dada no es utilizable, porque solo agregaría '../' al final. Rodearlo con Path.GetFullPath() te dará la ruta absoluta, haciéndola utilizable.

6voto

El siguiente método busca un archivo comenzando desde la ruta de inicio de la aplicación (carpeta *.exe). Si el archivo no se encuentra allí, se buscan las carpetas padre hasta que se encuentre el archivo o se llegue a la carpeta raíz. Se devuelve null si el archivo no se encuentra.

public static FileInfo FindApplicationFile(string fileName)
{
    string startPath = Path.Combine(Application.StartupPath, fileName);
    FileInfo file = new FileInfo(startPath);
    while (!file.Exists) {
        if (file.Directory.Parent == null) {
            return null;
        }
        DirectoryInfo parentDir = file.Directory.Parent;
        file = new FileInfo(Path.Combine(parentDir.FullName, file.Name));
    }
    return file;
}

Nota: Application.StartupPath se utiliza generalmente en aplicaciones WinForms, pero también funciona en aplicaciones de consola; sin embargo, deberás establecer una referencia al ensamblado System.Windows.Forms. Puedes reemplazar Application.StartupPath por
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) si lo prefieres.

Utilizo esta estrategia para encontrar archivos de configuración y recursos. Esto me permite compartirlos para múltiples aplicaciones o para versiones de depuración y de producción de una aplicación colocándolos en una carpeta padre común.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X