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"
c#
directory
filesystems
Masoud Abasian
quelle
quelle
Antworten:
Sie können
System.IO.Directory.GetParent()
das übergeordnete Verzeichnis eines bestimmten Verzeichnisses abrufen.quelle
DirectoryInfo.Parent
. zBnew System.IO.DirectoryInfo("c:/path/to/somewhere//").Parent
. @northbenstring parent = System.IO.Directory.GetParent(str_directory).FullName;
Siehe BOL
quelle
Wenn Sie
..\..
an Ihren vorhandenen Pfad anhängen , durchsucht das Betriebssystem den übergeordneten Ordner korrekt.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.
quelle
Ich habe festgestellt, dass Varianten von
System.IO.Path.Combine(myPath, "..")
am einfachsten und zuverlässigsten sind. Umso mehr, wenn das, was Northben sagt, wahr ist, erfordert GetParent einen zusätzlichen Aufruf, wenn ein abschließender Schrägstrich vorliegt. Das ist für mich unzuverlässig.Path.Combine stellt sicher, dass Sie mit Schrägstrichen nichts falsch machen.
..
verhält sich genauso wie überall sonst in Windows. Sie können\..
einem Pfad in cmd oder explorer eine beliebige Anzahl hinzufügen, und er verhält sich genau so, wie ich es unten beschreibe.Einige grundlegende
..
Verhaltensweisen:..
wird dieser abgeschnitten:Path.Combine(@"D:\Grandparent\Parent\Child.txt", "..")
=>D:\Grandparent\Parent\
..
wird eine Ebene nach oben verschoben:Path.Combine(@"D:\Grandparent\Parent\", "..")
=>D:\Grandparent\
..\..
folgt zweimal hintereinander den gleichen Regeln: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:\
quelle
Path.Combine(@"D:\Grandparent\Parent\Child.txt", @"..")
=D:\Grandparent\Parent\Child.txt\..
Path.Combine
schneidet die Zeichenfolge selbst nicht ab. Der Pfad , der einmal für den Zugriff auf das Dateisystem verwendet wurde, hat den beabsichtigten Effekt. Ich stimme jedoch zu, dass dies nicht optimal ist. In meiner neueren Antwort auf dieser Seite finden Sie einen Ansatz, mit dem die Zeichenfolge geändert wird, anstatt dass das Dateisystem zum Auflösen des Pfads erforderlich ist.Rufen Sie Directory.GetParent () zweimal auf, um ein Verzeichnis für Großeltern zu erhalten :
var gparent = Directory.GetParent(Directory.GetParent(str_directory).ToString());
quelle
var gparent = Directory.GetParent(str_directory).Parent; // Cleaner?
Directory.GetParent
ist wahrscheinlich eine bessere Antwort, aber der Vollständigkeit halber gibt es eine andere Methode, die Zeichenfolge verwendet und Zeichenfolge zurückgibt :Path.GetDirectoryName
.string parent = System.IO.Path.GetDirectoryName(str_directory);
quelle
So was:
System.IO.DirectoryInfo myDirectory = new DirectoryInfo(Environment.CurrentDirectory); string parentDirectory = myDirectory.Parent.FullName;
Viel Glück!
quelle
Vielleicht möchten Sie in die
DirectoryInfo
.Parent
Eigentum.quelle
Um Probleme mit Trailing \ zu vermeiden, nennen Sie es folgendermaßen:
string ParentFolder = Directory.GetParent( folder.Trim('\\')).FullName;
quelle
TrimEnd
wenn Sie nur das abschließende`'s . I'm not sure if a leading
` entfernen möchten, was in anderen Betriebssystemen von Bedeutung ist.Versuchen Sie dies, um Ihre Lösung zu erhalten
string directory = System.IO.Directory.GetParent(System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString()).ToString();
quelle
Dies ist der häufigste Weg - es hängt wirklich davon ab, was Sie genau tun: (Um dies zu erklären, werden im folgenden Beispiel die letzten 10 Zeichen entfernt, nach denen Sie gefragt haben. Wenn es jedoch einige Geschäftsregeln gibt, die Ihre Anforderungen erfüllen Um einen bestimmten Speicherort zu finden, sollten Sie diese verwenden, um den Verzeichnisspeicherort abzurufen, nicht den Speicherort 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);
quelle
\bin\Debug
und ohne nachgestellte` and no other path, so it's extraordinarily fragile. Your second doesn't work because
Umgebung sind. CurrentDirectory` ist eine Zeichenfolge, und Zeichenfolgen haben keineParent
Eigenschaft.Niemand hat eine Lösung bereitgestellt, die formübergreifend funktionieren würde. Ich weiß, dass es nicht speziell gefragt wurde, aber ich arbeite in einer Linux-Umgebung, in der die meisten Lösungen (wie zum Zeitpunkt der Veröffentlichung) einen Fehler liefern würden.
Das Hardcodieren von Pfadtrennzeichen (und anderen Dingen) führt bei allen anderen als Windows-Systemen zu einem Fehler.
In meiner ursprünglichen Lösung habe ich verwendet:
char filesep = Path.DirectorySeparatorChar; string datapath = $"..{filesep}..{filesep}";
Nachdem ich jedoch einige der Antworten hier gesehen hatte, passte ich sie an:
string datapath = Directory.GetParent(Directory.GetParent(Directory.GetCurrentDirectory()).FullName).FullName;
quelle
Da nichts anderes, was ich gefunden habe, hilft, dies auf wirklich normalisierte Weise zu lösen, ist hier eine andere Antwort.
Beachten Sie, dass einige Antworten auf ähnliche Fragen versuchen, das zu verwenden
Uri
Typ zu verwenden, dies jedoch mit abschließenden Schrägstrichen keinen abschließenden Schrägstrichen zu kämpfen hat.Meine andere Antwort auf dieser Seite funktioniert für Vorgänge, bei denen das Dateisystem funktioniert, aber wenn wir den aufgelösten Pfad jetzt haben möchten (z. B. aus Vergleichsgründen), ohne das Dateisystem zu durchlaufen,
C:/Temp/..
undC:/
würde anders betrachtet werden. Ohne das Dateisystem zu durchlaufen, bietet uns die Navigation auf diese Weise keinen normalisierten, ordnungsgemäß vergleichbaren Pfad.Was können wir tun?
Wir werden auf der folgenden Entdeckung aufbauen:
string
, nicht alschar
) wird einnull
Pfad genauso behandelt, wie er behandelt wird""
.GetDirectoryName
wird die letzte Pfadkomponente dank des hinzugefügten Schrägstrichs nicht verwerfen.GetDirectoryName
normalisiert Schrägstriche und Navigationspunkte...
durch Navigieren nach oben ein.GetDirectoryName
wirdnull
für einen leeren Weg zurückkehren, zu dem wir verschmelzen""
.Wie nutzen wir das?
Zuerst Normalisieren der Eingabepfad :
dirPath = Path.GetDirectoryName(dirPath + "/") ?? "";
Dann können wir das übergeordnete Verzeichnis abrufen und diesen Vorgang beliebig oft wiederholen, um weiter nach oben zu navigieren:
// This is reliable if path results from this or the previous operation path = Path.GetDirectoryName(path);
Beachten Sie, dass wir das Dateisystem noch nie berührt haben. Kein Teil des Pfades muss existieren, wie es wäre, wenn wir es benutzt hätten
DirectoryInfo
.quelle
Sie sollten nicht versuchen, das zu tun. Environment.CurrentDirectory gibt Ihnen 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 an einem relativen Speicherort befindet
Ich würde vorschlagen, dass Sie die Ressource, auf die Sie zugreifen möchten, an einen lokalen Ort verschieben. Von einem Systemverzeichnis (wie AppData)
quelle
IO.Path.GetFullPath(@"..\..")
Wenn Sie das "
bin\Debug\
" in den Projekteigenschaften -> Erstellen -> Ausgabepfad löschen , können Sie es einfach verwendenAppDomain.CurrentDomain.BaseDirectory
quelle