Я использую этот код для поиска каталога отладки
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"
c#
directory
filesystems
Масуд Абасян
источник
источник
Ответы:
Вы можете использовать
System.IO.Directory.GetParent()
для получения родительского каталога данного каталога.источник
DirectoryInfo.Parent
. напрnew System.IO.DirectoryInfo("c:/path/to/somewhere//").Parent
. @northbenstring 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 или проводнике, и он будет вести себя точно так, как я описываю ниже.Некоторое базовое
..
поведение:..
отрублю его: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:\
источник
Path.Combine(@"D:\Grandparent\Parent\Child.txt", @"..")
=D:\Grandparent\Parent\Child.txt\..
Path.Combine
не обрезает саму строку. Путь , однажды использованный для доступа к файловой системе, имеет желаемый эффект. Однако я согласен, что это неоптимально. См. Мой более поздний ответ на этой странице, чтобы узнать о подходе, который изменяет строку вместо того, чтобы файловая система требовала разрешения пути.Чтобы получить каталог «дедушка и бабушка», дважды вызовите Directory.GetParent () :
var gparent = Directory.GetParent(Directory.GetParent(str_directory).ToString());
источник
var gparent = Directory.GetParent(str_directory).Parent; // Cleaner?
Directory.GetParent
вероятно, лучший ответ, но для полноты есть другой метод, который принимает строку и возвращает строку:Path.GetDirectoryName
.string parent = System.IO.Path.GetDirectoryName(str_directory);
источник
Как это:
System.IO.DirectoryInfo myDirectory = new DirectoryInfo(Environment.CurrentDirectory); string parentDirectory = myDirectory.Parent.FullName;
Удачи!
источник
Возможно, вы захотите изучить файл
DirectoryInfo
.Parent
свойство.источник
Чтобы избежать проблем с завершением \, назовите его так:
string ParentFolder = Directory.GetParent( folder.Trim('\\')).FullName;
источник
TrimEnd
если хотите удалить только завершающие`'s . I'm not sure if a leading
символы, значимые в других ОС.Чтобы получить свое решение, попробуйте это
string directory = System.IO.Directory.GetParent(System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString()).ToString();
источник
Это наиболее распространенный способ - он действительно зависит от того, что именно вы делаете: (Чтобы объяснить, в приведенном ниже примере будут удалены последние 10 символов, которые вы просили, однако, если есть некоторые бизнес-правила, которые определяют вашу потребность чтобы найти конкретное местоположение, вы должны использовать их для получения местоположения каталога, а не для поиска местоположения чего-то другого и его изменения.)
// remove last 10 characters from a string str_directory = str_directory.Substring(0,str_directory.Length-10);
источник
\bin\Debug
, без завершающего` and no other path, so it's extraordinarily fragile. Your second doesn't work because
Environment.CurrentDirectory` - это строка, а строки не имеютParent
свойства.Никто не представил решения, которое работало бы в разных формах. Я знаю, что об этом специально не спрашивали, но я работаю в среде Linux, где большинство решений (как в то время, когда я публикую это) выдают ошибку.
Разделители путей жесткого кодирования (а также другие вещи) выдадут ошибку во всех системах, кроме Windows.
В моем исходном решении я использовал:
char filesep = Path.DirectorySeparatorChar; string datapath = $"..{filesep}..{filesep}";
Однако, увидев здесь некоторые ответы, я скорректировал его так:
string datapath = Directory.GetParent(Directory.GetParent(Directory.GetCurrentDirectory()).FullName).FullName;
источник
Поскольку ничто другое, что я нашел, не помогает решить эту проблему по-настоящему нормализованным образом, вот еще один ответ.
Обратите внимание, что некоторые ответы на подобные вопросы пытаются использовать
Uri
тип, но это также борется с конечными косыми чертами и отсутствием конечных косых черт.Другой мой ответ на этой странице работает для операций, которые заставляют файловую систему работать, но если мы хотим иметь разрешенный путь прямо сейчас (например, для сравнения), не просматривая файловую систему,
C:/Temp/..
иC:/
будет считаться другим. Без прохождения файловой системы такая навигация не дает нам нормализованного, должным образом сопоставимого пути.Что мы можем сделать?
Мы будем опираться на следующее открытие:
string
, а не какchar
) обработаетnull
путь так же, как и он""
.GetDirectoryName
не будет отбрасывать последний компонент пути благодаря добавленной косой черте.GetDirectoryName
нормализует косую черту и точки навигации...
при перемещении вверх.GetDirectoryName
вернетсяnull
на пустой путь, к которому мы сливаемся""
.Как мы это используем?
Сначала нормализуйте входной путь :
dirPath = Path.GetDirectoryName(dirPath + "/") ?? "";
Затем мы можем получить родительский каталог и повторить эту операцию любое количество раз для перехода вверх:
// This is reliable if path results from this or the previous operation path = Path.GetDirectoryName(path);
Обратите внимание, что мы никогда не касались файловой системы. Никакая часть пути не должна существовать, как если бы мы использовали
DirectoryInfo
.источник
Вы не должны пытаться это сделать. Environment.CurrentDirectory дает вам путь к исполняемому каталогу. Это согласуется независимо от того, где находится файл .exe. Вы не должны пытаться получить доступ к файлу, который, как предполагается, находится в обратном относительном местоположении
Я предлагаю вам переместить любой ресурс, к которому вы хотите получить доступ, в локальное место. Системного каталога (например, AppData)
источник
IO.Path.GetFullPath(@"..\..")
Если вы очистите "
bin\Debug\
" в свойствах проекта -> Сборка -> Путь вывода, то вы можете просто использоватьAppDomain.CurrentDomain.BaseDirectory
источник