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.