Pobierz (ostatnią część) nazwę bieżącego katalogu w C #

158

Muszę pobrać ostatnią część bieżącego katalogu, na przykład z /Users/smcho/filegen_from_directory/AIRPassthrough, muszę pobrać AIRPassthrough.

W Pythonie mogę to uzyskać za pomocą tego kodu.

import os.path

path = "/Users/smcho/filegen_from_directory/AIRPassthrough"
print os.path.split(path)[-1]

Lub

print os.path.basename(path)

Jak mogę zrobić to samo z C #?

DODANY

Z pomocą osób odpowiadających znalazłem to, czego potrzebowałem.

using System.Linq;
string fullPath = Path.GetFullPath(fullPath).TrimEnd(Path.DirectorySeparatorChar);
string projectName  = fullPath.Split(Path.DirectorySeparatorChar).Last();

lub

string fullPath = Path.GetFullPath(fullPath).TrimEnd(Path.DirectorySeparatorChar);
string projectName = Path.GetFileName(fullPath);
prosseek
źródło
1
W Pythonie raczej powinieneś to zrobić os.path.basename(path).
ReneSac,

Odpowiedzi:

132

Szukasz Path.GetFileName.
Pamiętaj, że to nie zadziała, jeśli ścieżka kończy się na \.

SLaks
źródło
3
@anti: źle; Próbowałem tego. Struny to struny. Wklej Path.GetFileName("/Users/smcho/filegen_from_directory/AIRPassthrough")do LINQPad, jeśli mi nie wierzysz.
SLaks
@antisanity Nie, zwróci nazwę katalogu, ale prawdopodobnie nie jest to dokładnie to, czego dotyczyło pytanie.
Jakob Möllås
@Jakob: Biorąc pod uwagę tytuł, myślę, że o to właśnie chodzi w tym pytaniu.
SLaks
3
@Light: To nie praca; Spróbuj. PathKlasa obsługuje zarówno separatory.
SLaks
31
Aby ta praca działała z katalogiem pobranym przez Directory.GetDirectories, użyj: string directoryName = Path.GetFileName (directory.TrimEnd (Path.DirectorySeparatorChar));
Fatlad
184

Możesz spróbować:

var path = @"/Users/smcho/filegen_from_directory/AIRPassthrough/";
var dirName = new DirectoryInfo(path).Name;
codybartfast
źródło
20
Podoba mi się to bardziej niż wybrana odpowiedź. (Ab) użycie GetFileName jest semantycznie błędne, ponieważ jest to katalog, który próbujesz odzyskać. Ponadto, aby uczynić GetFileName deterministycznym, musisz wziąć pod uwagę możliwość końcowego ukośnika lub odwrotnego ukośnika i przyciąć go, co jest brzydkie.
Simon Brangwin
var dirName = new DirectoryInfo (Path.GetDirectoryName (pathWithFilename)). Name // is better
kernowcode
@kernowcode Myślę, że zwróciłoby to „filegen_from_directory” zamiast „AIRPassthrough” zgodnie z żądaniem OP.
codybartfast
1
@SimonBrangwin Myślałem, że wszystko jest plikiem w Linuksie :)
Razor
12

Cóż, żeby dokładnie odpowiedzieć na twoje pytanie w tytule :-)

var lastPartOfCurrentDirectoryName = 
   Path.GetFileName(Environment.CurrentDirectory);
Jakob Möllås
źródło
12

To nieco inna odpowiedź, w zależności od tego, co masz. Jeśli masz listę plików i chcesz uzyskać nazwę ostatniego katalogu, w którym znajduje się plik, możesz to zrobić:

string path = "/attachments/1828_clientid/2938_parentid/somefiles.docx";
string result = new DirectoryInfo(path).Parent.Name;

To zwróci „2938_parentid”

ProVega
źródło
8

zamiast używać „/” do wywołania podziału, lepiej użyć Path.DirectorySeparatorChar:

tak:

path.split(Path.DirectorySeparatorChar).Last() 
Muad'Dib
źródło
1
Jedną rzeczą, której nie lubię w używaniu tego rozwiązania, jest to, że zakłada ono, skąd pochodzi ciąg. Co jeśli czytają dzienniki * nix w systemie Windows? Wtedy zostanie wykorzystana niewłaściwa postać, a skończysz z całą ścieżką, a nie zamierzonym efektem. Tylko moje 2 centy.
Bob G
zgadzam się z tobą w tej sprawie. OP powiedział „ostatnia część bieżącego katalogu”, więc to jest w porządku.
Muad'Dib
6
var lastFolderName = Path.GetFileName(
    path.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar));

Działa to, jeśli ścieżka zawiera separatory z ukośnikiem w przód lub w lewo.

Holf
źródło
1
Wygląda jak string.TrimEnd () akceptuje wiele znaków, więc nie ma potrzeby używania wielu wywołań. msdn.microsoft.com/en-us/library/…
Kyle Delaney,
1
@KyleDelaney, więc to robi! Odpowiedź dostosowana.
Holf
1
To tablica parametrów, więc .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)też działa.
Kyle Delaney,
1
Zastosowana lokalizacja .TrimEnd () jest nieprawidłowa. Powinien być zastosowany do path , a nie do Path.GetFileName . Zobacz odpowiedź od @Fatlad
Tony,
2

Spróbuj tego:

String newString = "";
Sting oldString = "/Users/smcho/filegen_from_directory/AIRPassthrough";

int indexOfLastSlash = oldString.LastIndexOf('/', 0, oldString.length());

newString = oldString.subString(indexOfLastSlash, oldString.length());

Kod może być wyłączony (nie testowałem go), ale pomysł powinien działać

Puchar Stanleya Phil
źródło
1

U mnie to działa idealnie :)

Path.GetFileName(path.TrimEnd('\\')
Akshay
źródło
0

Możesz wypróbować poniższy kod:

Path.GetFileName(userpath)

Code_Beginner
źródło
0

Możesz także użyć klasy Uri.

new Uri("file:///Users/smcho/filegen_from_directory/AIRPassthrough").Segments.Last()

Możesz użyć tej klasy, jeśli chcesz uzyskać inny segment lub jeśli chcesz zrobić to samo z adresem internetowym.

Chris
źródło