¿Cómo subir algunas carpetas?

115

Una opción sería hacer System.IO.Directory.GetParent () varias veces. ¿Existe una forma más elegante de subir algunas carpetas desde donde reside el ensamblado en ejecución?

Lo que intento hacer es encontrar un archivo de texto que resida en una carpeta encima de la carpeta de la aplicación. Pero el ensamblaje en sí está dentro del contenedor, que son algunas carpetas dentro de la carpeta de la aplicación.

desarrollador747
fuente
2
por lo general, una ruta relativa hace el truco como '.. \ .. \ .. \ .. \ Downfolder' pero depende de exactamente para qué estás tratando de hacer esto ...?
DiskJunky
¿Este es siempre el caso?
CR41G14
4
"Navegar" ¿cómo? ¿Te refieres al directorio actual? Si es así, debería poder hacerloDirectory.SetCurrentDirectory(@"..\..\..\..");
Peter Ritchie

Respuestas:

211

Otra forma sencilla es hacer esto:

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\";

A-Sharabiani
fuente
18
No tiene sentido usar Path.Combinecuando está agregando barra invertida manualmente de todos modos. Considere usar en su Path.Combine(path, "..", "..")lugar.
AXMIM
32

si c: \ carpeta1 \ carpeta2 \ carpeta3 \ bin es la ruta, el siguiente código devolverá la ruta de 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: \ carpeta1 \ carpeta2 \ carpeta3

si desea la ruta folder2, puede obtener el directorio por

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

luego obtendrá la ruta como c: \ folder1 \ folder2 \

Siby soleado
fuente
12

Puede usar ..\pathpara subir un nivel, ..\..\pathpara subir dos niveles desde el camino.

También puedes usar la Pathclase.

Clase de ruta de C #

DotNetUser
fuente
6

Esto es lo que mejor funcionó para mí:

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 se puede usar, porque simplemente agregará el '../' al final. Rodearlo con Path.GetFullPath()le dará el camino absoluto, haciéndolo utilizable.

Jacco
fuente
4

El siguiente método busca un archivo que comienza con la ruta de inicio de la aplicación (carpeta * .exe). Si el archivo no se encuentra allí, se buscan las carpetas principales hasta que se encuentra el archivo o se llega a la carpeta raíz. nullse devuelve si no se encontró el archivo.

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.StartupPathgeneralmente se usa en aplicaciones WinForms, pero también funciona en aplicaciones de consola; sin embargo, deberá establecer una referencia al System.Windows.Formsensamblaje. Puede reemplazar Application.StartupPathpor
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)si lo prefiere.

Olivier Jacot-Descombes
fuente
4

¿Quizás podría usar una función si desea declarar el número de niveles y ponerlo en una función?

private String GetParents(Int32 noOfLevels, String currentpath)
{
     String path = "";
     for(int i=0; i< noOfLevels; i++)
     {
         path += @"..\";
     }
     path += currentpath;
     return path;
}

Y podrías llamarlo así:

String path = this.GetParents(4, currentpath);
CR41G14
fuente
2

C#

string upTwoDir = Path.GetFullPath(Path.Combine(System.AppContext.BaseDirectory, @"..\..\"));
Moberme
fuente
1

esto puede ayudar

string parentOfStartupPath = Path.GetFullPath(Path.Combine(Application.StartupPath, @"../../")) + "Orders.xml";
if (File.Exists(parentOfStartupPath))
{
    // file found
}
Thomas
fuente
1

Tengo algunos directorios virtuales y no puedo usar métodos de directorio. Entonces, hice una función simple de división / unión para aquellos interesados. Aunque no tan seguro.

var splitResult = filePath.Split(new[] {'/', '\\'}, StringSplitOptions.RemoveEmptyEntries);
var newFilePath = Path.Combine(filePath.Take(splitResult.Length - 1).ToArray());

Por lo tanto, si desea mover hasta 4, sólo tiene que cambiar la 1a 4y añadir algunos controles a excepciones evitar.

Sauleil
fuente
0

Si conoce la carpeta a la que desea navegar, busque el índice y luego la subcadena.

            var ind = Directory.GetCurrentDirectory().ToString().IndexOf("Folderame");

            string productFolder = Directory.GetCurrentDirectory().ToString().Substring(0, ind);
Taran
fuente
2
Esto falla en muchos casos. ¿Qué pasa si el nombre de la carpeta es solo a, por ejemplo? ¿Qué pasa si el camino se ve así C:\Folderame3\Folderame2\Folderame\...?
41686d6564
si el nombre de la carpeta es solo una búsqueda "\\ a \\" o \\ a si es la última
Taran