Як орієнтуватися на кілька папок вгору?


115

Одним із варіантів було б зробити System.IO.Directory.GetParent () кілька разів. Чи є більш витончений спосіб подорожувати кількома папками вгору, де знаходиться збірник, що виконує?

Що я намагаюся зробити - це знайти текстовий файл, який знаходиться в одній папці над папкою програми. Але сама збірка знаходиться всередині бункера, який знаходиться в декількох папках у папці додатків.


2
Зазвичай відносний шлях робить такий трюк, як ".. \ .. \ .. \ .. \ Нижній папку", але це залежить від того, що саме ви намагаєтесь зробити для цього ...?
DiskJunky

це завжди так?
CR41G14

4
"Навігація" як? Ви маєте на увазі поточний каталог? Якщо це так, ви можете мати можливістьDirectory.SetCurrentDirectory(@"..\..\..\..");
Пітер Річі

Відповіді:


211

Інший простий спосіб - це зробити:

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

Примітка. Це піднімається на два рівні. Результатом буде: newPath = @"C:\Folder1\Folder2\";


18
Немає сенсу використовувати, 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 # Клас шляху


6

Ось що для мене найкраще працювало:

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

Отримати "правильний" шлях не було проблемою, додавання "../" очевидно робить це, але після цього даний рядок не є корисним, оскільки він просто додасть "../" в кінці. Навколишнє середовище Path.GetFullPath()дасть вам абсолютний шлях, зробить його корисним.


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


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та додати кілька чеків, щоб уникнути винятків.


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, якщо останній
Таран
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.