Как перейти на несколько папок вверх?

115

Один из вариантов - выполнить System.IO.Directory.GetParent () несколько раз. Есть ли более изящный способ перемещения на несколько папок вверх от того места, где находится исполняемая сборка?

Что я пытаюсь сделать, так это найти текстовый файл, который находится на одну папку над папкой приложения. Но сама сборка находится внутри корзины, то есть на несколько папок глубоко в папке приложения.

developer747
источник
2
обычно относительный путь делает фокус вроде '.. \ .. \ .. \ .. \ Downfolder', но это зависит от того, для чего именно вы пытаетесь это сделать ...?
DiskJunky
это всегда так?
CR41G14
4
"Навигация" как? Вы имеете в виду текущий каталог? Если да, то у вас должно получитьсяDirectory.SetCurrentDirectory(@"..\..\..\..");
Питер Ричи

Ответы:

213

Другой простой способ - сделать это:

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

Примечание. Это идет на два уровня выше. Результат будет: newPath = @"C:\Folder1\Folder2\";

A-Sharabiani
источник
19
В Path.Combineлюбом случае нет смысла использовать, когда вы добавляете обратную косую черту вручную. Рассмотрите возможность использования Path.Combine(path, "..", "..")вместо этого.
AXMIM
32

если c: \ folder1 \ folder2 \ folder3 \ bin - это путь, то следующий код вернет базовую папку пути к папке bin

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

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

т.е. c: \ folder1 \ folder2 \ folder3

если вам нужен путь к папке2, вы можете получить каталог с помощью

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

тогда вы получите путь как c: \ folder1 \ folder2 \

Сиби Санни
источник
12

Вы можете использовать ..\pathдля перехода на один уровень вверх, ..\..\pathдля перехода на два уровня от пути.

Вы Pathтоже можете использовать класс.

C # Path класс

DotNetUser
источник
6

Вот что сработало для меня лучше всего:

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

Получить «правильный» путь не было проблемой, очевидно, что добавление «../» делает это, но после этого данную строку нельзя будет использовать, потому что она просто добавит «../» в конце. Окружение Path.GetFullPath()даст вам абсолютный путь, что сделает его пригодным для использования.

Jacco
источник
4

Следующий метод выполняет поиск файла, начинающегося с пути запуска приложения (папка * .exe). Если файл там не найден, выполняется поиск в родительских папках, пока не будет найден файл или не будет достигнута корневая папка. nullвозвращается, если файл не был найден.

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

Примечание: Application.StartupPathобычно используется в приложениях WinForms, но работает и в консольных приложениях; однако вам нужно будет указать ссылку на System.Windows.Formsсборку. Вы можете заменить Application.StartupPathна,
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)если хотите.

Оливье Жако-Декомб
источник
4

Может быть, вы могли бы использовать функцию, если хотите объявить количество уровней и поместить его в функцию?

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

И вы могли бы назвать это так:

String path = this.GetParents(4, currentpath);
CR41G14
источник
2

C #

string upTwoDir = Path.GetFullPath(Path.Combine(System.AppContext.BaseDirectory, @"..\..\"));
Moberme
источник
1

это может помочь

string parentOfStartupPath = Path.GetFullPath(Path.Combine(Application.StartupPath, @"../../")) + "Orders.xml";
if (File.Exists(parentOfStartupPath))
{
    // file found
}
Томас
источник
1

У меня есть несколько виртуальных каталогов, и я не могу использовать методы каталогов. Итак, я сделал простую функцию разделения / объединения для заинтересованных. Но не так безопасно.

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

Итак, если вы хотите переместиться на 4 выше, вам просто нужно изменить значение 1на 4и добавить несколько проверок, чтобы избежать исключений.

Sauleil
источник
0

Если вы знаете папку, к которой хотите перейти, найдите ее индекс и подстроку.

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

            string productFolder = Directory.GetCurrentDirectory().ToString().Substring(0, ind);
Таран
источник
2
Во многих случаях это не удается . Что делать, если имя папки просто a, например? Что, если путь выглядит так C:\Folderame3\Folderame2\Folderame\...?
41686d6564
если имя папки - это просто поиск "\\ a \\" или \\ a, если он последний
Таран