Подтвердить что ты не робот

Как найти родительский каталог в С#?

Я использую этот код для поиска каталога отладки

public string str_directory = Environment.CurrentDirectory.ToString();

"C:\\Users\\Masoud\\Documents\\Visual Studio 2008\\Projects\\MyProj\\MyProj\\bin\\Debug"

Как найти родительскую папку, как показано ниже?

"C:\\Users\\Masoud\\Documents\\Visual Studio 2008\\Projects\\MyProj\\MyProj"

4b9b3361

Ответ 1

Вы можете использовать System.IO.Directory.GetParent() для извлечения родительского каталога заданного каталога.

Ответ 2

string parent = System.IO.Directory.GetParent(str_directory).FullName;

См. BOL

Ответ 3

Если вы добавили ..\.. к существующему пути, операционная система будет правильно просматривать папку с большим родителем.

Это должно выполнить задание:

System.IO.Path.Combine("C:\\Users\\Masoud\\Documents\\Visual Studio 2008\\Projects\\MyProj\\MyProj\\bin\\Debug", @"..\..");

Если вы просмотрите этот путь, вы просмотрите каталог с большим родителем.

Ответ 4

Я нашел варианты System.IO.Path.Combine(myPath, "..") самым простым и надежным. Более того, если то, что говорит Northben, верно, что GetParent требует дополнительного вызова, если есть конечная косая черта. Для меня это ненадежно.

Path.Combine гарантирует, что вы никогда не ошибетесь с косой чертой.

.. ведет себя точно так же, как и везде в Windows. Вы можете добавить любое число \.. к пути в cmd или explorer и будет вести себя точно так, как я описал ниже.

Некоторое базовое поведение ..:

  • Если есть имя файла, .. отключит его:

Path.Combine(@"D:\Grandparent\Parent\Child.txt", "..") = > D:\Grandparent\Parent\

  1. Если путь является каталогом, .. будет двигаться вверх по уровню:

Path.Combine(@"D:\Grandparent\Parent\", "..") = > D:\Grandparent\

  1. ..\.. следует тем же правилам дважды в строке:

Path.Combine(@"D:\Grandparent\Parent\Child.txt", @"..\..") = > D:\Grandparent\ Path.Combine(@"D:\Grandparent\Parent\", @"..\..") = > D:\

  1. И это имеет тот же эффект:

Path.Combine(@"D:\Grandparent\Parent\Child.txt", "..", "..") = > D:\Grandparent\ Path.Combine(@"D:\Grandparent\Parent\", "..", "..") = > D:\

Ответ 5

Чтобы получить каталог "grandparent", дважды вызовите Directory.GetParent():

var gparent = Directory.GetParent(Directory.GetParent(str_directory).ToString());

Ответ 6

Вот так:

System.IO.DirectoryInfo myDirectory = new DirectoryInfo(Environment.CurrentDirectory);
string parentDirectory = myDirectory.Parent.FullName;

Удачи!

Ответ 7

Directory.GetParent, вероятно, лучший ответ, но для полноты есть другой метод, который принимает строку и возвращает строку: Path.GetDirectoryName.

string parent = System.IO.Path.GetDirectoryName(str_directory);

Ответ 8

Возможно, вы захотите изучить свойство DirectoryInfo. Parent.

Ответ 9

Вы не должны пытаться это сделать. Environment.CurrentDirectory предоставляет путь к исполняемому каталогу. Это согласовано независимо от того, где находится файл .exe. Вы не должны пытаться получить доступ к файлу, который предположительно находится в обратном относительном местоположении.

Я предлагаю вам переместить любой ресурс, к которому вы хотите получить доступ, в локальное местоположение. Системного каталога (например, AppData)

Ответ 10

Это наиболее распространенный способ - он действительно зависит от того, что именно вы делаете: (Для пояснения в приведенном ниже примере будут удалены последние 10 символов, что вы и просили, однако, если есть какие-то бизнес-правила, которые определяют ваши потребности чтобы найти конкретное местоположение, вы должны использовать его для получения местоположения каталога, а не для поиска местоположения чего-либо другого и изменения его.)

// remove last 10 characters from a string
str_directory = str_directory.Substring(0,str_directory.Length-10);

Ответ 11

Чтобы избежать проблем с завершением \, вызовите его следующим образом:

  string ParentFolder =  Directory.GetParent( folder.Trim('\\')).FullName;

Ответ 12

Никто не предоставил решение, которое бы работало перекрестно. Я знаю, что об этом специально не спрашивали, но я работаю в среде Linux, где большинство решений (на момент публикации) приводили к ошибке.

Жесткое кодирование разделителей пути (как и других вещей) приведет к ошибке во всем, кроме систем Windows.

В моем первоначальном решении я использовал:

char filesep = Path.DirectorySeparatorChar;
string datapath = $"..{filesep}..{filesep}";

Однако, увидев некоторые ответы здесь, я изменил их так:

string datapath = Directory.GetParent(Directory.GetParent(Directory.GetCurrentDirectory()).FullName).FullName; 

Ответ 13

IO.Path.GetFullPath(@"..\..")

Если вы очистите "bin\Debug\" в свойствах Project → Build → Output path, вы можете просто использовать AppDomain.CurrentDomain.BaseDirectory

Ответ 14

Чтобы получить свое решение попробуйте это

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