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?

Vasmay
źródło

Odpowiedzi:

205

Zobacz DirectoryInfo.Name :

string dirName = new DirectoryInfo(@"c:\projects\roott\wsdlproj\devlop\beta2\text").Name;
Alex Pacurar
źródło
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;
Shekhar
źródło
16

Spróbuj tego

var myFolderName = @"c:\projects\roott\wsdlproj\devlop\beta2\text";
var result = Path.GetFileName(myFolderName);
Øyvind Bråthen
źródło
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();
Kristof Claes
źródło
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"
123iamking
źródło
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(@"\"));
Zuoanqh
źródło
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;
krishna
źródło
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);
Roberto
źródło
1

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

var directoryName = System.IO.Path.GetFileName(@"c:\projects\roott\wsdlproj\devlop\beta2\text");
Steve Cooper
źródło
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.

marsze
źródło
-3
Path.GetDirectoryName(@"c:\projects\roott\wsdlproj\devlop\beta2\text");

MSDN: Metoda Path.GetDirectoryName

swissben
źródło
11
To powróci c:\projects\roott\wsdlproj\devlop\beta2, a nie o to chodziło w PO.
Øyvind Bråthen