Comment puis-je 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 puis-je trouver le dossier parent comme indiqué ci-dessous?

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

53
demandé sur Simon 2011-07-29 20:05:34

14 réponses

Vous pouvez utiliser Système.IO.Répertoire.GetParent() pour récupérer le répertoire parent d'un répertoire donné.

92
répondu Sylence 2011-07-29 16:09:47
string parent = System.IO.Directory.GetParent(str_directory).FullName;

Voir BOL

36
répondu billinkc 2014-01-30 16:34:50

Si vous ajoutez ..\.. à votre chemin existant, le système d'exploitation parcourra 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.

23
répondu Pierre-Alain Vigeant 2015-09-22 19:23:19

Pour obtenir un répertoire 'grandparent', appelez Directory.GetParent() deux fois:

var gparent = Directory.GetParent(Directory.GetParent(str_directory).ToString());
11
répondu Jay Riggs 2011-07-29 16:12:21

J'ai trouvé des variantes de System.IO.Path.Combine(myPath, "..") pour être les plus faciles et les plus fiables. Encore plus si ce que dit northben est vrai, getparent nécessite un appel supplémentaire s'il y a une barre oblique finale. Qui, pour moi, n'est pas fiable.

Chemin.Combiner fait en sorte que vous ne vous trompez jamais avec des barres obliques.

.. se comporte exactement comme il le fait partout ailleurs dans Windows. Vous pouvez ajouter n'importe quel nombre de \.. à un chemin dans cmd ou explorer et il se comportera exactement comme je le décris ci-dessous.

Certains de base .. comportement:

  1. S'il y a un nom de fichier, {[1] } va le couper:

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

  1. Si le chemin est un répertoire, .. va monter 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:\

10
répondu Timo 2015-09-18 14:28:38

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
répondu Carl Walsh 2015-10-03 02:55:39

Comme ceci:

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

Bonne chance!

4
répondu Michael Ames 2011-07-29 16:14:57

Vous voudrez peut-être regarder dans le DirectoryInfo.Parent propriété.

3
répondu ravuya 2011-07-29 16:08:14

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

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

1
répondu musefan 2011-07-29 16:16:15

C'est la façon la plus courante -- cela dépend vraiment de ce que vous faites exactement: (Pour expliquer, l'exemple ci-dessous supprimera les 10 derniers caractères qui sont ce que vous avez demandé, mais s'il y a des règles métier qui conduisent votre besoin de trouver un emplacement spécifique, vous devez les utiliser pour récupérer l'emplacement du répertoire, pas trouver l'emplacement d'autre chose et le modifier.)

// remove last 10 characters from a string
str_directory = str_directory.Substring(0,str_directory.Length-10);
1
répondu Hogan 2018-02-28 18:31:44
IO.Path.GetFullPath(@"..\..")

Si vous désactivez le "bin\Debug\" dans les propriétés du Projet -> Build -> chemin de Sortie, vous pouvez simplement utiliser AppDomain.CurrentDomain.BaseDirectory

0
répondu Slai 2016-04-07 12:13:22

Pour éviter les problèmes avec fining\, appelez-le de cette façon:

  string ParentFolder =  Directory.GetParent( folder.Trim('\\')).FullName;
0
répondu A.D. 2016-08-18 15:25:38

Pour obtenir votre solution essayez ceci

string directory = System.IO.Directory.GetParent(System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString()).ToString();
0
répondu Siby Sunny 2016-09-30 08:52:31

Personne n'a fourni une solution qui fonctionnerait en Forme croisée. Je sais que ce n'était pas spécifiquement demandé mais je travaille dans un environnement linux où la plupart des solutions (comme au moment où je poste ceci) fourniraient une erreur.

Les séparateurs de chemin de codage en dur (ainsi que d'autres choses) donneront une erreur dans 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; 
0
répondu Madivad 2018-06-14 12:53:37