Jak uzyskać katalog z pełnej ścieżki do pliku?

526

Jaki jest najprostszy sposób na uzyskanie katalogu, w którym znajduje się plik? Używam tego do ustawienia katalogu roboczego.

string filename = @"C:\MyDirectory\MyFile.bat";

W tym przykładzie powinienem pobrać „C: \ MyDirectory”.

Nawet Mien
źródło
3
Czy to nie powinien być dosłowny ciąg znaków? @"C:\MyDirectory\MyFile.bat"
Edgar
3
Czy ktoś chce chronić to pytanie, kto ma do tego prawo? 11 podobnych odpowiedzi z ostatnimi z 2017 r.
Boern

Odpowiedzi:

837

Jeśli zdecydowanie masz absolutną ścieżkę, użyj Path.GetDirectoryName(path).

Jeśli możesz uzyskać tylko nazwę względną, użyj new FileInfo(path).Directory.FullName.

Należy pamiętać, że Pathi FileInfooba znajdują się w przestrzeni nazw System.IO.

Jon Skeet
źródło
1
Rzeczywiście, ale czy istnieje metoda o nazwie GetDirectory? Czy to nie GetDirectoryName?
Brandon
1
Możesz po prostu użyć DirectoryName zamiast Directory.FullPath, prawda?
Steven Robbins
1
Byłem przeciwny otrzymywaniu względnego nazwiska. Nie zauważyłem, że ścieżka będzie absolutna. Mam teraz obie wersje :)
Jon Skeet
Czy używasz snippy, aby to sprawdzić? ;)
shahkalpesh
1
@UlyssesAlves: Uważam, że new FileInfo(path).Directory.FullNamepowinien działać w obu przypadkach.
Jon Skeet,
59
System.IO.Path.GetDirectoryName(filename)
Cherian
źródło
22
Path.GetDirectoryName(filename);
Grzenio
źródło
12

Możesz użyć System.IO.Path.GetDirectory(filename)lub zmienić ścieżkę w FileInfoi użyć FileInfo.Directory.

Jeśli robisz inne rzeczy ze ścieżką, FileInfomoże to mieć zalety.

Reed Copsey
źródło
1
w klasie ścieżki nie ma metody „GetDirectory”;
musiałeś
12

Użyj poniższego kodu, aby uzyskać ścieżkę do folderu

Path.GetDirectoryName(filename);

To zwróci „C: \ MyDirectory” w twoim przypadku

thejustv
źródło
10

Możesz użyć Path.GetDirectoryNamei po prostu podać nazwę pliku.

Łącze MSDN

Brandon
źródło
5

Jeśli pracujesz z FileInfoobiektem, istnieje prosty sposób na wyodrębnienie stringreprezentacji pełnej ścieżki katalogu za pośrednictwem DirectoryNamewłaściwości.

Opis FileInfo.DirectoryNamenieruchomości za pośrednictwem MSDN:

Pobiera ciąg reprezentujący pełną ścieżkę katalogu.

Przykładowe użycie:

string filename = @"C:\MyDirectory\MyFile.bat";
FileInfo fileInfo = new FileInfo(filename);
string directoryFullPath = fileInfo.DirectoryName; // contains "C:\MyDirectory"

Link do dokumentacji MSDN .

Derek W.
źródło
5

Możesz pobrać bieżącą ścieżkę aplikacji, używając:

string AssemblyPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location).ToString();

Powodzenia!

David Castro
źródło
0

Najpierw musisz użyć przestrzeni nazw System.IO. Następnie;

string filename = @"C:\MyDirectory\MyFile.bat";
string newPath = Path.GetFullPath(fileName);

lub

string newPath = Path.GetFullPath(openFileDialog1.FileName));
Umut D.
źródło
0

Możesz użyć Path.GetFullPathw większości przypadków. Ale jeśli chcesz uzyskać ścieżkę również w przypadku, gdy nazwa pliku jest względnie zlokalizowana, możesz użyć poniższej ogólnej metody:

string GetPath(string filePath)
{
  return Path.GetDirectoryName(Path.GetFullPath(filePath))
}

Na przykład:

GetPath("C:\Temp\Filename.txt") powrót "C:\Temp\"

GetPath("Filename.txt")wrócić current working directoryjak"C:\Temp\"

Minh Nguyen
źródło
0

W moim przypadku musiałem znaleźć nazwę katalogu pełnej ścieżki (katalogu), więc po prostu:

var dirName = path.Split('\\').Last();
Amir No-Family
źródło
1
OP potrzebuje, "C:\MyDirectory"a nie potrzebuje MyDirectory. Porada dotycząca stosowania metod manipulacji ciągiem jest ryzykowna, istnieje wiele pułapek, a raczej należy stosować Pathmetody dedykowane .
Sinatr
-1

Path.GetDirectoryName (Context.Parameters [„assemblypath”])

Ami Vaknin
źródło
Path.GetDirectoryNamejest wspomniany w wielu innych odpowiedziach (w tym w odpowiedziach zaakceptowanych)
barbsan
aha? Więc?? czy jest jakiś sens?
Ami Vaknin