Używam tego kodu do znajdowania katalogu debugowania
public string str_directory = Environment.CurrentDirectory.ToString();
"C:\\Users\\Masoud\\Documents\\Visual Studio 2008\\Projects\\MyProj\\MyProj\\bin\\Debug"
Jak mogę znaleźć folder nadrzędny, jak pokazano poniżej?
"C:\\Users\\Masoud\\Documents\\Visual Studio 2008\\Projects\\MyProj\\MyProj"
c#
directory
filesystems
Masoud Abasian
źródło
źródło
Odpowiedzi:
Możesz użyć,
System.IO.Directory.GetParent()
aby pobrać katalog nadrzędny danego katalogu.źródło
DirectoryInfo.Parent
. npnew System.IO.DirectoryInfo("c:/path/to/somewhere//").Parent
. @northbenstring parent = System.IO.Directory.GetParent(str_directory).FullName;
Zobacz BOL
źródło
Jeśli dołączysz
..\..
do istniejącej ścieżki, system operacyjny poprawnie przegląda folder nadrzędny.To powinno wystarczyć:
System.IO.Path.Combine("C:\\Users\\Masoud\\Documents\\Visual Studio 2008\\Projects\\MyProj\\MyProj\\bin\\Debug", @"..\..");
Jeśli przejrzysz tę ścieżkę, przejrzysz katalog nadrzędny.
źródło
Odkryłem, że warianty
System.IO.Path.Combine(myPath, "..")
są najłatwiejsze i najbardziej niezawodne. Tym bardziej, jeśli prawdą jest to, co mówi northben, to GetParent wymaga dodatkowego wywołania, jeśli na końcu znajduje się ukośnik. To dla mnie niewiarygodne.Path.Combine zapewnia, że nigdy nie pomylisz się z ukośnikami.
..
zachowuje się dokładnie tak samo, jak wszędzie indziej w systemie Windows. Możesz dodać dowolną liczbę\..
do ścieżki w cmd lub eksploratorze i będzie zachowywać się dokładnie tak, jak opisuję poniżej.Niektóre podstawowe
..
zachowania:..
odetnie ją:Path.Combine(@"D:\Grandparent\Parent\Child.txt", "..")
=>D:\Grandparent\Parent\
..
przejdzie na wyższy poziom:Path.Combine(@"D:\Grandparent\Parent\", "..")
=>D:\Grandparent\
..\..
przestrzega tych samych zasad, dwa razy z rzędu: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:\
źródło
Path.Combine(@"D:\Grandparent\Parent\Child.txt", @"..")
=D:\Grandparent\Parent\Child.txt\..
Path.Combine
nie obcina samego ciągu. Ścieżka używana kiedyś do uzyskania dostępu do systemu plików ma zamierzony skutek. Zgadzam się jednak, że jest to nieoptymalne. Zobacz moją najnowszą odpowiedź na tej stronie, aby poznać podejście, które modyfikuje ciąg zamiast potrzebować systemu plików do rozwiązania ścieżki.Aby uzyskać katalog dla dziadków, wywołaj Directory.GetParent () dwa razy:
var gparent = Directory.GetParent(Directory.GetParent(str_directory).ToString());
źródło
var gparent = Directory.GetParent(str_directory).Parent; // Cleaner?
Directory.GetParent
Prawdopodobnie jest to lepsze rozwiązanie, ale dla kompletności istnieje inna metoda, która przyjmuje i zwraca ciąg znaków:Path.GetDirectoryName
.string parent = System.IO.Path.GetDirectoryName(str_directory);
źródło
Lubię to:
System.IO.DirectoryInfo myDirectory = new DirectoryInfo(Environment.CurrentDirectory); string parentDirectory = myDirectory.Parent.FullName;
Powodzenia!
źródło
Możesz zajrzeć do
DirectoryInfo
.Parent
własność.źródło
Aby uniknąć problemów z końcowym \, nazwij to w ten sposób:
string ParentFolder = Directory.GetParent( folder.Trim('\\')).FullName;
źródło
TrimEnd
jeśli chcesz tylko usunąć końcowe`'s . I'm not sure if a leading
`jest istotne w innych systemach operacyjnych.Aby uzyskać rozwiązanie, spróbuj tego
string directory = System.IO.Directory.GetParent(System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString()).ToString();
źródło
To jest najczęstszy sposób - to naprawdę zależy od tego, co dokładnie robisz: (Aby wyjaśnić, poniższy przykład usunie ostatnie 10 znaków, o które prosiłeś, jednak jeśli istnieją jakieś zasady biznesowe, które napędzają twoje potrzeby Aby znaleźć określoną lokalizację, należy użyć ich do pobrania lokalizacji katalogu, a nie do znajdowania lokalizacji czegoś innego i modyfikowania jej).
// remove last 10 characters from a string str_directory = str_directory.Substring(0,str_directory.Length-10);
źródło
\bin\Debug
, bez końcowego katalogu` and no other path, so it's extraordinarily fragile. Your second doesn't work because
Environment.CurrentDirectory` jest łańcuchem, a łańcuchy nie mająParent
właściwości.Nikt nie dostarczył rozwiązania, które działałoby w różnych formach. Wiem, że nie było to specjalnie zadane, ale pracuję w środowisku linuxowym, w którym większość rozwiązań (jak w momencie, gdy to publikowałem) powodowałaby błąd.
Zakodowane separatory ścieżek (a także inne rzeczy) spowodują błąd w innych systemach niż Windows.
W moim oryginalnym rozwiązaniu zastosowałem:
char filesep = Path.DirectorySeparatorChar; string datapath = $"..{filesep}..{filesep}";
Jednak po zobaczeniu niektórych odpowiedzi tutaj dostosowałem to tak, aby było:
string datapath = Directory.GetParent(Directory.GetParent(Directory.GetCurrentDirectory()).FullName).FullName;
źródło
Ponieważ nic innego, co znalazłem, nie pomaga rozwiązać tego w prawdziwie znormalizowany sposób, oto inna odpowiedź.
Zwróć uwagę, że w niektórych odpowiedziach na podobne pytania próbuje się używać tego
Uri
typu, ale to problem z końcowymi ukośnikami i bez końcowych ukośników.Moja druga odpowiedź na tej stronie działa w przypadku operacji, które uruchamiają system plików, ale jeśli chcemy teraz mieć rozwiązaną ścieżkę (na przykład w celach porównawczych), bez przechodzenia przez system plików,
C:/Temp/..
iC:/
zostanie uznana za inną. Bez przechodzenia przez system plików nawigacja w ten sposób nie zapewnia nam znormalizowanej, odpowiednio porównywalnej ścieżki.Co możemy zrobić?
Będziemy opierać się na następującym odkryciu:
string
, nie jakochar
) spowoduje traktowanienull
ścieżki tak samo, jak traktuje""
.GetDirectoryName
powstrzyma się od odrzucenia ostatniego komponentu ścieżki dzięki dodanemu ukośnikowi.GetDirectoryName
znormalizuje ukośniki i kropki nawigacyjne...
przez nawigację w górę.GetDirectoryName
powrócąnull
po pustą ścieżkę, do której się zlewamy""
.Jak tego używamy?
Najpierw znormalizuj ścieżkę wejściową :
dirPath = Path.GetDirectoryName(dirPath + "/") ?? "";
Następnie możemy pobrać katalog nadrzędny i możemy powtórzyć tę operację dowolną liczbę razy, aby przejść dalej w górę:
// This is reliable if path results from this or the previous operation path = Path.GetDirectoryName(path);
Zauważ, że nigdy nie dotknęliśmy systemu plików. Żadna część ścieżki nie musi istnieć, jak by to było, gdybyśmy skorzystali
DirectoryInfo
.źródło
Nie powinieneś tego robić. Environment.CurrentDirectory podaje ścieżkę do katalogu wykonywalnego. Jest to spójne niezależnie od lokalizacji pliku .exe. Nie powinieneś próbować uzyskać dostępu do pliku, co do którego zakłada się, że znajduje się w odwrotnej lokalizacji względnej
Sugerowałbym przeniesienie dowolnego zasobu, do którego chcesz uzyskać dostęp, do lokalnej lokalizacji. Katalogu systemowego (na przykład AppData)
źródło
IO.Path.GetFullPath(@"..\..")
Jeśli wyczyścisz "
bin\Debug\
" we właściwościach projektu -> Kompiluj -> Ścieżka wyjściowa, możesz po prostu użyćAppDomain.CurrentDomain.BaseDirectory
źródło