Jak nawigować po kilku folderach w górę?

115

Jedną z opcji byłoby wykonanie System.IO.Directory.GetParent () kilka razy. Czy istnieje bardziej wdzięczny sposób na przejście o kilka folderów w górę z miejsca, w którym znajduje się zestaw wykonawczy?

To, co próbuję zrobić, to znaleźć plik tekstowy, który znajduje się jeden folder nad folderem aplikacji. Ale sam zestaw znajduje się w koszu, który znajduje się kilka folderów głęboko w folderze aplikacji.

programista747
źródło
2
zwykle ścieżka względna działa jak „.. \ .. \ .. \ .. \ Downfolder”, ale to zależy od tego, dla czego dokładnie próbujesz to zrobić ...?
DiskJunky,
czy tak jest zawsze?
CR41G14
4
Jak „nawigować”? Czy masz na myśli bieżący katalog? Jeśli tak, powinieneś być w stanie to zrobićDirectory.SetCurrentDirectory(@"..\..\..\..");
Peter Ritchie,

Odpowiedzi:

211

Innym prostym sposobem jest zrobienie tego:

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

Uwaga To idzie o dwa poziomy w górę. Wynik byłby taki: newPath = @"C:\Folder1\Folder2\";

A-Sharabiani
źródło
18
Nie ma sensu używać, Path.Combinegdy i tak dodajesz ukośnik odwrotny ręcznie. Rozważ użycie Path.Combine(path, "..", "..")zamiast tego.
AXMIM
32

jeśli c: \ folder1 \ folder2 \ folder3 \ bin to ścieżka, to poniższy kod zwróci ścieżkę do folderu podstawowego folderu bin

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

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

tzn. c: \ folder1 \ folder2 \ folder3

jeśli chcesz ścieżkę folder2, możesz pobrać katalog przez

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

wtedy otrzymasz ścieżkę jako c: \ folder1 \ folder2 \

Siby Sunny
źródło
12

Możesz użyć, ..\pathaby przejść o jeden poziom wyżej,..\..\path aby przejść dwa poziomy w górę od ścieżki.

Możesz też użyć Pathklasy.

Klasa C # Path

DotNetUser
źródło
6

Oto, co zadziałało najlepiej dla mnie:

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

Uzyskanie „właściwej” ścieżki nie stanowiło problemu, dodanie „../” oczywiście to robi, ale po tym podany ciąg nie nadaje się do użytku, ponieważ po prostu doda „../” na końcu. Otaczanie go Path.GetFullPath()da ci absolutną ścieżkę, czyniąc ją użyteczną.

Jacco
źródło
4

Poniższa metoda przeszukuje plik zaczynający się od ścieżki startowej aplikacji (folder * .exe). Jeśli plik nie zostanie tam znaleziony, foldery nadrzędne są przeszukiwane do momentu znalezienia pliku lub osiągnięcia folderu głównego. nulljest zwracany, jeśli plik nie został znaleziony.

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

Uwaga: Application.StartupPathjest zwykle używany w aplikacjach WinForms, ale działa również w aplikacjach konsolowych; jednak będziesz musiał ustawić odniesienie do System.Windows.Formszestawu. Jeśli wolisz, możesz wymienić Application.StartupPathna
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location).

Olivier Jacot-Descombes
źródło
4

Może mógłbyś użyć funkcji, jeśli chcesz zadeklarować liczbę poziomów i umieścić ją w funkcji?

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

Można to nazwać tak:

String path = this.GetParents(4, currentpath);
CR41G14
źródło
2

DO#

string upTwoDir = Path.GetFullPath(Path.Combine(System.AppContext.BaseDirectory, @"..\..\"));
moberme
źródło
1

to może pomóc

string parentOfStartupPath = Path.GetFullPath(Path.Combine(Application.StartupPath, @"../../")) + "Orders.xml";
if (File.Exists(parentOfStartupPath))
{
    // file found
}
Tomasz
źródło
1

Mam kilka katalogów wirtualnych i nie mogę użyć metod katalogów. Zrobiłem więc prostą funkcję dzielenia / łączenia dla zainteresowanych. Jednak nie tak bezpieczne.

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

Tak więc, jeśli chcesz, aby przejść od 4, po prostu trzeba zmienić 1, aby 4dodać niektóre kontrole, aby uniknąć wyjątków.

Sauleil
źródło
0

Jeśli znasz folder, do którego chcesz przejść, znajdź jego indeks, a następnie podciąg.

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

            string productFolder = Directory.GetCurrentDirectory().ToString().Substring(0, ind);
Taran
źródło
2
To zawodzi w tak wielu przypadkach. A co jeśli nazwa folderu jest ana przykład tylko? A co jeśli ścieżka wygląda tak C:\Folderame3\Folderame2\Folderame\...?
41686d6564
jeśli nazwa folderu to tylko wyszukiwanie „\\ a \\” lub \\ a, jeśli jest ostatnie
Taran