it-swarm.com.de

Wie finde ich das übergeordnete Verzeichnis in C #?

Ich benutze diesen Code, um das Debug-Verzeichnis zu finden

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

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

Wie finde ich den übergeordneten Ordner wie unten gezeigt?

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

59
Masoud Abasian

Sie können System.IO.Directory.GetParent () verwenden, um das übergeordnete Verzeichnis eines bestimmten Verzeichnisses abzurufen.

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

Siehe BOL

39
billinkc

Wenn Sie ..\.. an Ihren vorhandenen Pfad anhängen, durchsucht das Betriebssystem den übergeordneten Ordner ordnungsgemäß.

Das sollte den Job machen:

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

Wenn Sie diesen Pfad durchsuchen, durchsuchen Sie das übergeordnete Verzeichnis.

25

Ich habe festgestellt, dass Varianten von System.IO.Path.Combine(myPath, "..") die einfachsten und zuverlässigsten sind. Noch mehr, wenn das, was northben sagt, wahr ist, erfordert GetParent einen zusätzlichen Aufruf, wenn ein nachstehender Schrägstrich vorliegt. Das ist für mich unzuverlässig.

Path.Combine stellt sicher, dass Sie mit Slashes niemals einen Fehler machen.

.. verhält sich genauso wie überall in Windows. Sie können einem Pfad in cmd oder Explorer eine beliebige Anzahl von \.. hinzufügen. Er wird sich genau so verhalten, wie ich es unten beschrieben habe.

Einige grundlegende .. Verhalten:

  1. Wenn es einen Dateinamen gibt, hebt .. das ab:

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

  1. Wenn der Pfad ein Verzeichnis ist, wird .. eine Ebene nach oben verschoben:

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

  1. ..\.. folgt den gleichen Regeln zweimal hintereinander:

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

  1. Und das hat genau den gleichen Effekt:

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

13
Timo

Um ein "Großeltern" -Verzeichnis zu erhalten, rufen Sie zweimal Directory.GetParent () auf:

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

So was:

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

Viel Glück!

6
Michael Ames

Directory.GetParent ist wahrscheinlich eine bessere Antwort, aber der Vollständigkeit halber gibt es eine andere Methode, die string verwendet und string zurückgibt: Path.GetDirectoryName .

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

Möglicherweise möchten Sie die Eigenschaft DirectoryInfo .Parent betrachten.

3
ravuya

Das solltest du nicht versuchen. Environment.CurrentDirectory gibt den Pfad des ausführbaren Verzeichnisses an. Dies ist konsistent, unabhängig davon, wo sich die EXE-Datei befindet. Sie sollten nicht versuchen, auf eine Datei zuzugreifen, von der angenommen wird, dass sie sich in einer relativen Position befindet

Ich würde vorschlagen, dass Sie die Ressource, auf die Sie zugreifen möchten, an einen lokalen Standort verschieben. Eines Systemverzeichnisses (wie AppData)

1
musefan

Dies ist der gebräuchlichste Weg - es hängt wirklich davon ab, was Sie genau tun: (Um das zu erläutern, werden im folgenden Beispiel die letzten 10 Zeichen entfernt. Dies ist, wonach Sie gefragt haben, allerdings, wenn es Geschäftsregeln gibt Wenn Sie einen bestimmten Ort suchen müssen, sollten Sie diesen verwenden, um den Verzeichnisstandort abzurufen, nicht den Ort von etwas anderem zu finden und ihn zu ändern.)

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

Niemand hat eine Lösung bereitgestellt, die übergreifend funktionieren würde. Ich weiß, es wurde nicht ausdrücklich gefragt, aber ich arbeite in einer Linux-Umgebung, in der die meisten Lösungen (wie zum Zeitpunkt der Veröffentlichung dieses Beitrags) einen Fehler liefern würden.

Hardcoding-Pfadtrennzeichen (und andere Dinge) geben nur in Windows-Systemen einen Fehler aus. 

In meiner ursprünglichen Lösung habe ich verwendet:

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

Nachdem ich einige der Antworten hier gesehen habe, habe ich sie so angepasst:

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

Um Probleme mit dem Nachführen von\zu vermeiden, nennen Sie es so:

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

Um Ihre Lösung zu erhalten, probieren Sie das aus 

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

Wenn Sie das "bin\Debug\" in den Projekteigenschaften -> Erstellen -> Ausgabepfad löschen, können Sie einfach AppDomain.CurrentDomain.BaseDirectory verwenden.

0
Slai