¿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.


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


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 \



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.


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.


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);

2

C#

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

1

esto puede ayudar

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

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.


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);

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.