Навигация по каталогам с помощью Path.Combine

Я пытаюсь перейти на несколько каталогов, а затем войти в папку ввода...

Я пробовал это

var path = Path.Combine(Directory.GetCurrentDirectory(), @"..\\..\\..\\Input\\" + filename);

но ценность пути заканчивается тем, что..

C:\\Users\user1\\Desktop\\ToSend\\test\\reverser\\Reverser\\bin\\Debug\\..\\\\..\\\\..\\\\Input\\\\limerick.txt

Есть идеи?

5 ответов

Решение

Вам нужно получить абсолютный, а не относительный путь. Поэтому вы должны использовать GetFullPath() вместо Combine ().

Проверьте это

Прежде всего, при использовании @ со строками нет необходимости экранировать символы \, поэтому просто используя одиночные косые черты, вы можете избежать двойных косых черт в результате.

По поводу пути вопроса: это зависит от того, что вы хотите сделать. Если строка результата используется для выполнения некоторых файловых операций с использованием System.IO.File.* или для записи / чтения из файла, используя StreamReader/StreamWriterсама операция позаботится о перемещении вверх по каталогам при обнаружении \..\так что не надо волноваться!

Чтобы расширить ответ Ламлуми и очистить код:

var path = Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), @"..\..\..\Input", filename));

должен произвести абсолютный путь к вашему файлу.

Вы можете использовать свойство DirectoryInfo.Parent.

Предполагая, что вы знаете, сколько уровней вы хотите удалить со своего пути:

public string DirectoryGOUp(string path, int levelCount) {
    if(string.IsNullOrEmpty(path) || levelCount < 1)
        return path;

    string upperLevel = System.IO.Path.GetDirectoryName(path);

    if(--levelCount > 0)
        return DirectoryGOUp(upperLevel, levelCount);

    return upperLevel;
}

А потом назовите это:

var newPath = DirectoryGOUp (Directory.GetCurrentDirectory (), 3); newPath = Path.Combine (newPath, @ "Input \" + filename);

Другие вопросы по тегам