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);


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 \.


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;

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);

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”


8

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

tak:

path.split(Path.DirectorySeparatorChar).Last() 

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.


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ć


1

U mnie to działa idealnie :)

Path.GetFileName(path.TrimEnd('\\')


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.

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.