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



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



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


"C:UsersMasoudDocumentsVisual Studio 2008ProjectsMyProjMyProjbinDebug"



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



"C:UsersMasoudDocumentsVisual Studio 2008ProjectsMyProjMyProj"

1047   14  

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, и он будет вести себя точно так, как я описываю под.

некоторые основные .. поведение:

  1. если есть имя файла, .. отрубит это:

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:\

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

    Ничего не найдено.