Wie navigiere ich ein paar Ordner nach oben?

115

Eine Möglichkeit wäre, System.IO.Directory.GetParent () einige Male auszuführen. Gibt es eine elegantere Möglichkeit, ein paar Ordner von dem Ort aus zu verschieben, an dem sich die ausführende Assembly befindet?

Ich versuche, eine Textdatei zu finden, die sich in einem Ordner über dem Anwendungsordner befindet. Die Assembly selbst befindet sich jedoch im Bin, der sich einige Ordner tief im Anwendungsordner befindet.

Entwickler747
quelle
2
Normalerweise macht ein relativer Pfad den Trick wie '.. \ .. \ .. \ .. \ Downfolder', aber es hängt davon ab, wofür genau Sie dies versuchen ...?
DiskJunky
ist das immer der fall
CR41G14
4
"Navigieren" wie? Meinst du das aktuelle Verzeichnis? Wenn ja, sollten Sie in der Lage seinDirectory.SetCurrentDirectory(@"..\..\..\..");
Peter Ritchie

Antworten:

211

Ein anderer einfacher Weg ist dies zu tun:

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

Hinweis Dies geht zwei Stufen höher. Das Ergebnis wäre: newPath = @"C:\Folder1\Folder2\";

A-Sharabiani
quelle
18
Es macht keinen Sinn, Path.CombineBackslash manuell hinzuzufügen. Erwägen Sie Path.Combine(path, "..", "..")stattdessen die Verwendung .
AXMIM
32

Wenn c: \ folder1 \ folder2 \ folder3 \ bin der Pfad ist, gibt der folgende Code den Pfadbasisordner des bin-Ordners zurück

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

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

dh c: \ Ordner1 \ Ordner2 \ Ordner3

Wenn Sie den Ordner2-Pfad möchten, können Sie das Verzeichnis über abrufen

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

Dann erhalten Sie den Pfad als c: \ Ordner1 \ Ordner2 \

Siby Sunny
quelle
12

Sie können verwenden ..\path, um eine Ebene nach oben ..\..\pathzu gehen, um zwei Ebenen vom Pfad nach oben zu gehen.

Sie können auch PathKlasse verwenden.

C # -Pfadklasse

DotNetUser
quelle
6

Das hat bei mir am besten funktioniert:

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

Den 'richtigen' Pfad zu finden war nicht das Problem, das Hinzufügen von '../' macht das natürlich, aber danach kann die angegebene Zeichenfolge nicht mehr verwendet werden, da am Ende nur das '../' hinzugefügt wird. Wenn Sie es mit umgeben Path.GetFullPath(), erhalten Sie den absoluten Pfad, der es nutzbar macht.

Jacco
quelle
4

Die folgende Methode durchsucht eine Datei, die mit dem Startpfad der Anwendung beginnt (Ordner * .exe). Wird die Datei dort nicht gefunden, werden die übergeordneten Ordner durchsucht, bis entweder die Datei gefunden oder der Stammordner erreicht wurde. nullwird zurückgegeben, wenn die Datei nicht gefunden wurde.

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

Hinweis: Application.StartupPathWird normalerweise in WinForms-Anwendungen verwendet, funktioniert aber auch in Konsolenanwendungen. Sie müssen jedoch einen Verweis auf die System.Windows.FormsBaugruppe festlegen . Sie können ersetzen Application.StartupPathdurch ,
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)wenn Sie es vorziehen.

Olivier Jacot-Descombes
quelle
4

Vielleicht könnten Sie eine Funktion verwenden, wenn Sie die Anzahl der Ebenen deklarieren und in eine Funktion einfügen möchten?

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

Und man könnte es so nennen:

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

C #

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

das kann helfen

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

Ich habe einige virtuelle Verzeichnisse und kann keine Verzeichnismethoden verwenden. Also habe ich eine einfache Split / Join-Funktion für Interessierte erstellt. Nicht so sicher.

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

Also, wenn Sie 4 bis verschieben möchten, müssen Sie nur die Änderungen 1zu 4und einige Prüfungen zu vermeiden Ausnahmen hinzufügen.

Sauleil
quelle
0

Wenn Sie den Ordner kennen, zu dem Sie navigieren möchten, suchen Sie den Index und dann den Teilstring.

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

            string productFolder = Directory.GetCurrentDirectory().ToString().Substring(0, ind);
Taran
quelle
2
Dies schlägt in so vielen Fällen fehl . Was ist, wenn der Name des Ordners beispielsweise nur lautet a? Was ist, wenn der Pfad so aussieht C:\Folderame3\Folderame2\Folderame\...?
Ahmed Abdelhameed
wenn Ordnername nur eine Suche ist "\\ a \\" oder \\ a wenn es das letzte ist
Taran