Как найти родительский каталог в C#?
Я использую этот код для поиска debug каталог
public string str_directory = Environment.CurrentDirectory.ToString();
"C:UsersMasoudDocumentsVisual Studio 2008ProjectsMyProjMyProjbinDebug"
как я могу найти родительскую папку, как показано ниже?
"C:UsersMasoudDocumentsVisual Studio 2008ProjectsMyProjMyProj"
14 ответов:
вы можете использовать System.IO.Directory.GetParent() для получения родительского каталога данного каталога.
string parent = System.IO.Directory.GetParent(str_directory).FullName;посмотреть бол
Если добавить
..\..к существующему пути операционная система будет правильно просматривать папку grand-parent.Это должно сделать работу:
System.IO.Path.Combine("C:\Users\Masoud\Documents\Visual Studio 2008\Projects\MyProj\MyProj\bin\Debug", @"..\..");Если вы просматриваете этот путь, вы будете просматривать каталог grand-parent.
Я нашел варианты
System.IO.Path.Combine(myPath, "..")быть самым простым и надежным. Тем более, если то, что говорит northben, верно, что GetParent требует дополнительного вызова, если есть конечная косая черта. Это, по-моему, ненадежно.путь.Комбинат гарантирует, что вы никогда не ошибетесь с косыми чертами.
..ведет себя точно так же, как и везде в 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:\
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собственность.
вы не должны пытаться сделать это. Окружающая среда.CurrentDirectory дает вам путь к исполняемому каталогу. Это согласуется независимо от того, где .EXE файл. Вы не должны пытаться получить доступ к файлу, который, как предполагается, находится в обратном относительном местоположении
Я бы предложил вам переместить любой ресурс, к которому вы хотите получить доступ, в локальное местоположение. Системного каталога (например, AppData)
Это самый распространенный способ -- это действительно зависит от того, что вы делаете именно: (Чтобы объяснить, в приведенном ниже примере будут удалены последние 10 символов, которые вы просили, однако если есть некоторые бизнес-правила, которые управляют вашей потребностью найти определенное местоположение, вы должны использовать их для получения местоположения каталога, а не найти местоположение чего-то другого и изменить его.)
// remove last 10 characters from a string str_directory = str_directory.Substring(0,str_directory.Length-10);
IO.Path.GetFullPath(@"..\..")Если вы снимите "
bin\Debug\" в свойствах проекта - > Build - > Output path, то вы можете просто использоватьAppDomain.CurrentDomain.BaseDirectory
чтобы избежать проблем с трейлингом \, назовите его так:
string ParentFolder = Directory.GetParent( folder.Trim('\')).FullName;
получить ваше решение попробуйте это
string directory = System.IO.Directory.GetParent(System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString()).ToString();
никто не предоставил решение, которое будет работать кросс-форма. Я знаю, что это не было специально задано, но я работаю в среде linux, где большинство решений (как и в то время, когда я публикую это) будет предоставлять ошибку.
разделители пути жесткого кодирования (а также другие вещи) дадут ошибку во всем, кроме систем Windows.
в моем оригинальном решении я использовал:
char filesep = Path.DirectorySeparatorChar; string datapath = $"..{filesep}..{filesep}";однако, увидев некоторые ответы здесь, я настроил его на быть:
string datapath = Directory.GetParent(Directory.GetParent(Directory.GetCurrentDirectory()).FullName).FullName;
Comments