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"
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é.
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.
Pour obtenir un répertoire 'grandparent', appelez Directory.GetParent() deux fois:
var gparent = Directory.GetParent(Directory.GetParent(str_directory).ToString());
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:
- S'il y a un nom de fichier, {[1] } va le couper:
Path.Combine(@"D:\Grandparent\Parent\Child.txt", "..")
=> D:\Grandparent\Parent\
- Si le chemin est un répertoire,
..
va monter d'un niveau:
Path.Combine(@"D:\Grandparent\Parent\", "..")
=> D:\Grandparent\
-
..\..
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:\
- et cela a exactement le même effet:
Path.Combine(@"D:\Grandparent\Parent\Child.txt", "..", "..")
=> D:\Grandparent\
Path.Combine(@"D:\Grandparent\Parent\", "..", "..")
=> D:\
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);
Comme ceci:
System.IO.DirectoryInfo myDirectory = new DirectoryInfo(Environment.CurrentDirectory);
string parentDirectory = myDirectory.Parent.FullName;
Bonne chance!
Vous voudrez peut-être regarder dans le DirectoryInfo
.Parent
propriété.
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)
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);
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
Pour éviter les problèmes avec fining\, appelez-le de cette façon:
string ParentFolder = Directory.GetParent( folder.Trim('\\')).FullName;
Pour obtenir votre solution essayez ceci
string directory = System.IO.Directory.GetParent(System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString()).ToString();
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;