Uzyskaj nazwę folderu z pełnej ścieżki pliku


116

Jak uzyskać nazwę folderu z pełnej ścieżki aplikacji?

To jest ścieżka do pliku poniżej,

c:\projects\root\wsdlproj\devlop\beta2\text

Tutaj „tekst” to nazwa folderu.

Jak mogę uzyskać nazwę folderu z tej ścieżki?

Odpowiedzi:


205

Zobacz DirectoryInfo.Name :

string dirName = new DirectoryInfo(@"c:\projects\roott\wsdlproj\devlop\beta2\text").Name;

Czy to nie wymaga, aby folder faktycznie istniał w systemie plików (nazwa folderu nadal byłaby „tekstowa” dla tej pełnej ścieżki pliku, gdyby folder „c: \ projects \ root \ wsdlproj \ devlop \ beta2 \ text” nie ( obecnie) istnieje w systemie plików)?
— Peter Mortensen

@PeterMortensen, no. Właśnie to przetestowałem i metoda zwraca nazwę folderu najniższego poziomu z ciągu, nawet jeśli ścieżka folderu nie istnieje.
— vbguyny

1
Dzięki, świetna odpowiedź. Ale jestem trochę zdziwiony, że System.IO.Directory nie obsługuje takiej operacji.
— anhoppe

1
@anhoppe - zgadzam się. Inną opcją, którą widziałem, jest Path.GetDirectoryName msdn.microsoft.com/en-us/library/… - ale nie będę mógł go przetestować do jutra.
— Don Cheadle

30

Myślę, że chcesz uzyskać nazwę folderu nadrzędnego ze ścieżki pliku. To jest łatwe do zdobycia. Jednym ze sposobów jest utworzenie FileInfoobiektu typu i użycie jegoDirectory właściwości.

Przykład:

FileInfo fInfo = new FileInfo("c:\projects\roott\wsdlproj\devlop\beta2\text\abc.txt");

String dirName = fInfo.Directory.Name;

16

Spróbuj tego

var myFolderName = @"c:\projects\roott\wsdlproj\devlop\beta2\text";
var result = Path.GetFileName(myFolderName);

jeśli masz nazwę pliku w łańcuchu, zwraca ona również nazwę pliku
— swissben

1
W tym przypadku tekst jest nazwą pliku (bez rozszerzenia). Myślałem, że o to chodziło w OP. To, czy jest to folder, czy nazwa pliku, w rzeczywistości nie ma znaczenia. Jeśli ciąg nie zawiera nazwy pliku, ten kod da mu to, czego szuka.
— Øyvind Bråthen

4
Chyba że ścieżki kończą się na \ tak:@"c:\projects\roott\wsdlproj\devlop\beta2\text\"
— Kristof Claes

1
to nie działa w przypadku folderu. Otrzymuję pusty ciąg. Musi być obecny plik
— BraveNewMath

3
Działa to dobrze, jeśli ścieżka folderu nie zawiera końcowego ukośnika odwrotnego (jak na przykład ścieżka folderu zwrócona przez Path.GetDirectoryName () ). Nazwa tej funkcji, GetFileName (), jest jednak nieco myląca.
— Peter Mortensen

9

Możesz użyć tego:

string path = @"c:\projects\roott\wsdlproj\devlop\beta2\text";
string lastDirectory = path.Split(new char[] { System.IO.Path.DirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries).Last();

co jeśli ścieżka wygląda następująco: @ "c: \ projects \ roott \ wsdlproj \ devlop \ beta2 \ text \", więc z dodatkowym DirectorySeparatorChar
— Alex Pacurar

1
@Alex - zmodyfikowałem swój kod, aby działał również z takimi ścieżkami. StringSplitOptions.RemoveEmptyEntriesZrób sztuczkę.
— Kristof Claes

Zgodnie z msdn.microsoft.com/en-us/library/… , FileInfo może zgłosić wyjątek, jeśli nie zostanie nadane wymagane pozwolenie.
— Daniel B

5

Po prostu użyj Path.GetFileName

Tutaj - wyodrębnij nazwę folderu z pełnej ścieżki folderu:

string folderName = Path.GetFileName(@"c:\projects\root\wsdlproj\devlop\beta2\text");//Return "text"

Oto kilka dodatkowych - Wyodrębnij nazwę folderu z pełnej ścieżki pliku:

string folderName = Path.GetFileName(Path.GetDirectoryName(@"c:\projects\root\wsdlproj\devlop\beta2\text\GTA.exe"));//Return "text"

3

Pomyślałem, że nie ma innego wyjścia, jak tylko wejść do systemu plików, aby dowiedzieć się, czy text.txt jest katalogiem, czy tylko plikiem. Jeśli chciałeś czegoś prostego, może możesz po prostu użyć:

s.Substring(s.LastIndexOf(@"\"));

1
Aby uniknąć ukośnika na początku ciągu: s.Substring (s.LastIndexOf (@ "\") + 1);
— David Yates

2

W tym przypadku plik, który chcesz pobrać, jest przechowywany w zmiennej strpath:

string strPath = Server.MapPath(Request.ApplicationPath) + "/contents/member/" + strFileName;

2

Oto alternatywna metoda, która działała dla mnie bez konieczności tworzenia obiektu DirectoryInfo. Kluczową kwestią jest to, że GetFileName()działa, gdy na ścieżce nie ma końcowego ukośnika.

var name = Path.GetFileName(path.TrimEnd(Path.DirectorySeparatorChar));

Przykład:

var list = Directory.EnumerateDirectories(path, "*")
        .Select(p => new
        {
            id = "id_" + p.GetHashCode().ToString("x"),
            text = Path.GetFileName(p.TrimEnd(Path.DirectorySeparatorChar)),
            icon = "fa fa-folder",
            children = true
        })
        .Distinct()
        .OrderBy(p => p.text);

1

Można to również zrobić w ten sposób;

var directoryName = System.IO.Path.GetFileName(@"c:\projects\roott\wsdlproj\devlop\beta2\text");

to zwróci pusty ciąg
— disklosr

@disklosr - właśnie przetestowano z ScriptCs i zwraca „tekst”
— Steve Cooper

2
Działa to dobrze, jeśli ścieżka folderu nie zawiera końcowego ukośnika odwrotnego (jak na przykład ścieżka folderu zwrócona przez Path.GetDirectoryName () ). Nazwa tej funkcji, GetFileName (), jest jednak nieco myląca.
— Peter Mortensen

0

Na podstawie poprzednich odpowiedzi (ale naprawione)

using static System.IO.Path;

var dir = GetFileName(path?.TrimEnd(DirectorySeparatorChar, AltDirectorySeparatorChar));

Wyjaśnienie GetFileNameze źródła .NET :

Zwraca nazwę i rozszerzenie podanej ścieżki. Wynikowy ciąg zawiera znaki ścieżki, które następują po ostatnim ukośniku odwrotnym („\”), ukośniku („/”) lub dwukropku („:”) w ścieżce. Wynikowy ciąg to cała ścieżka, jeśli ścieżka nie zawiera odwrotnego ukośnika po usunięciu końcowych ukośników, ukośników lub dwukropków. Wynikowy ciąg ma wartość null, jeśli path ma wartość null.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.