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"
Vous pouvez utiliser System.IO.Directory.GetParent () pour récupérer le répertoire parent d'un répertoire donné.
string parent = System.IO.Directory.GetParent(str_directory).FullName;
Voir BOL
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.
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:
..
le coupera:Path.Combine(@"D:\Grandparent\Parent\Child.txt", "..")
=> D:\Grandparent\Parent\
..
montera 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:\
Path.Combine(@"D:\Grandparent\Parent\Child.txt", "..", "..")
=> D:\Grandparent\
Path.Combine(@"D:\Grandparent\Parent\", "..", "..")
=> D:\
Pour obtenir un répertoire "grands-parents", appelez Directory.GetParent () deux fois:
var gparent = Directory.GetParent(Directory.GetParent(str_directory).ToString());
Comme ça:
System.IO.DirectoryInfo myDirectory = new DirectoryInfo(Environment.CurrentDirectory);
string parentDirectory = myDirectory.Parent.FullName;
Bonne chance!
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);
Vous voudrez peut-être examiner la propriété DirectoryInfo
.Parent
.
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)
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);
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;
Pour éviter les problèmes de fin \, appelez cela 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();
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