Ответ 1
Вы можете использовать System.IO.Directory.GetParent() для извлечения родительского каталога заданного каталога.
Я использую этот код для поиска каталога отладки
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"
Вы можете использовать System.IO.Directory.GetParent() для извлечения родительского каталога заданного каталога.
string parent = System.IO.Directory.GetParent(str_directory).FullName;
См. BOL
Если вы добавили ..\..
к существующему пути, операционная система будет правильно просматривать папку с большим родителем.
Это должно выполнить задание:
System.IO.Path.Combine("C:\\Users\\Masoud\\Documents\\Visual Studio 2008\\Projects\\MyProj\\MyProj\\bin\\Debug", @"..\..");
Если вы просмотрите этот путь, вы просмотрите каталог с большим родителем.
Я нашел варианты System.IO.Path.Combine(myPath, "..")
самым простым и надежным. Более того, если то, что говорит Northben, верно, что GetParent требует дополнительного вызова, если есть конечная косая черта. Для меня это ненадежно.
Path.Combine гарантирует, что вы никогда не ошибетесь с косой чертой.
..
ведет себя точно так же, как и везде в Windows. Вы можете добавить любое число \..
к пути в cmd или explorer и будет вести себя точно так, как я описал ниже.
Некоторое базовое поведение ..
:
..
отключит его: Path.Combine(@"D:\Grandparent\Parent\Child.txt", "..")
= > D:\Grandparent\Parent\
..
будет двигаться вверх по уровню: Path.Combine(@"D:\Grandparent\Parent\", "..")
= > D:\Grandparent\
..\..
следует тем же правилам дважды в строке: Path.Combine(@"D:\Grandparent\Parent\Child.txt", @"..\..")
= > D:\Grandparent\
Path.Combine(@"D:\Grandparent\Parent\", @"..\..")
= > D:\
Path.Combine(@"D:\Grandparent\Parent\Child.txt", "..", "..")
= > D:\Grandparent\
Path.Combine(@"D:\Grandparent\Parent\", "..", "..")
= > D:\
Чтобы получить каталог "grandparent", дважды вызовите Directory.GetParent():
var gparent = Directory.GetParent(Directory.GetParent(str_directory).ToString());
Вот так:
System.IO.DirectoryInfo myDirectory = new DirectoryInfo(Environment.CurrentDirectory);
string parentDirectory = myDirectory.Parent.FullName;
Удачи!
Directory.GetParent
, вероятно, лучший ответ, но для полноты есть другой метод, который принимает строку и возвращает строку: Path.GetDirectoryName
.
string parent = System.IO.Path.GetDirectoryName(str_directory);
Возможно, вы захотите изучить свойство DirectoryInfo
. Parent
.
Вы не должны пытаться это сделать. Environment.CurrentDirectory предоставляет путь к исполняемому каталогу. Это согласовано независимо от того, где находится файл .exe. Вы не должны пытаться получить доступ к файлу, который предположительно находится в обратном относительном местоположении.
Я предлагаю вам переместить любой ресурс, к которому вы хотите получить доступ, в локальное местоположение. Системного каталога (например, AppData)
Это наиболее распространенный способ - он действительно зависит от того, что именно вы делаете: (Для пояснения в приведенном ниже примере будут удалены последние 10 символов, что вы и просили, однако, если есть какие-то бизнес-правила, которые определяют ваши потребности чтобы найти конкретное местоположение, вы должны использовать его для получения местоположения каталога, а не для поиска местоположения чего-либо другого и изменения его.)
// remove last 10 characters from a string
str_directory = str_directory.Substring(0,str_directory.Length-10);
Чтобы избежать проблем с завершением \, вызовите его следующим образом:
string ParentFolder = Directory.GetParent( folder.Trim('\\')).FullName;
Никто не предоставил решение, которое бы работало перекрестно. Я знаю, что об этом специально не спрашивали, но я работаю в среде Linux, где большинство решений (на момент публикации) приводили к ошибке.
Жесткое кодирование разделителей пути (как и других вещей) приведет к ошибке во всем, кроме систем Windows.
В моем первоначальном решении я использовал:
char filesep = Path.DirectorySeparatorChar;
string datapath = $"..{filesep}..{filesep}";
Однако, увидев некоторые ответы здесь, я изменил их так:
string datapath = Directory.GetParent(Directory.GetParent(Directory.GetCurrentDirectory()).FullName).FullName;
IO.Path.GetFullPath(@"..\..")
Если вы очистите "bin\Debug\
" в свойствах Project → Build → Output path, вы можете просто использовать AppDomain.CurrentDomain.BaseDirectory
Чтобы получить свое решение попробуйте это
string directory = System.IO.Directory.GetParent(System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString()).ToString();