web-dev-qa-db-fra.com

Comment trouver le répertoire parent en C #?

J'utilise ce code pour trouver le répertoire de débogage

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

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

Comment trouver le dossier parent comme indiqué ci-dessous?

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

59
Masoud Abasian

Vous pouvez utiliser System.IO.Directory.GetParent () pour récupérer le répertoire parent d'un répertoire donné.

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

Voir BOL

39
billinkc

Si vous ajoutez ..\.. à votre chemin existant, le système d'exploitation explorera correctement le dossier grand-parent.

Cela devrait faire le travail:

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

Si vous parcourez ce chemin, vous parcourrez le répertoire grand-parent.

25

J'ai trouvé des variantes de System.IO.Path.Combine(myPath, "..") comme étant les plus faciles et les plus fiables. Cela est d'autant plus vrai si ce que dit northben est vrai, GetParent nécessite un appel supplémentaire s'il existe une barre oblique inférieure. Pour moi, cela n’est pas fiable.

Path.Combine fait en sorte que vous ne vous trompiez jamais avec les barres obliques.

.. se comporte exactement comme partout ailleurs dans Windows. Vous pouvez ajouter un nombre quelconque de \.. à un chemin dans cmd ou Explorer et celui-ci se comportera exactement comme décrit ci-dessous.

Quelques comportements .. basiques:

  1. S'il y a un nom de fichier, .. le coupera:

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

  1. Si le chemin est un répertoire, .. montera d'un niveau:

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

  1. ..\.. suit les mêmes règles deux fois de suite:

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

  1. Et cela a exactement le même effet:

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

13
Timo

Pour obtenir un répertoire "grands-parents", appelez Directory.GetParent () deux fois:

var gparent = Directory.GetParent(Directory.GetParent(str_directory).ToString());
11
Jay Riggs

Comme ça:

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

Bonne chance!

6
Michael Ames

Directory.GetParent est probablement une meilleure réponse, mais pour être complet, il existe une méthode différente qui prend string et renvoie string: Path.GetDirectoryName .

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

Vous voudrez peut-être examiner la propriété DirectoryInfo .Parent.

3
ravuya

Vous ne devriez pas essayer de faire ça. Environment.CurrentDirectory vous donne le chemin du répertoire exécutable. Ceci est cohérent quel que soit l'emplacement du fichier .exe. Vous ne devriez pas essayer d'accéder à un fichier supposé se trouver dans un emplacement relatif à l'envers

Je vous suggère de déplacer n'importe quelle ressource à laquelle vous souhaitez accéder dans un emplacement local. D'un répertoire système (tel que AppData)

1
musefan

C’est le moyen le plus courant - cela dépend vraiment de ce que vous faites exactement: (Pour expliquer, l’exemple ci-dessous supprimera les 10 derniers caractères, ce qui est ce que vous avez demandé. Lorsque vous devez rechercher un emplacement spécifique, vous devez utiliser ceux-ci pour extraire l’emplacement du répertoire, ne pas rechercher l’emplacement d’un autre élément et le modifier.)

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

Personne n'a fourni de solution qui fonctionnerait sous forme croisée. Je sais que cela n’a pas été spécifiquement demandé, mais je travaille dans un environnement Linux où la plupart des solutions (comme au moment où je les publie) génèrent une erreur.

Les séparateurs de chemin codés en dur (ainsi que d'autres éléments) généreront une erreur sur tout sauf les systèmes Windows. 

Dans ma solution d'origine, j'ai utilisé:

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

Cependant, après avoir vu certaines des réponses ici, je l'ai ajusté pour être:

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

Pour éviter les problèmes de fin \, appelez cela de cette façon:

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

Pour obtenir votre solution, essayez ceci 

string directory = System.IO.Directory.GetParent(System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString()).ToString();
0
Siby Sunny
IO.Path.GetFullPath(@"..\..")

Si vous effacez le "bin\Debug\" dans les propriétés du projet -> Construire -> le chemin de sortie, vous pouvez simplement utiliser AppDomain.CurrentDomain.BaseDirectory

0
Slai