Ruft den (letzten Teil des) aktuellen Verzeichnisnamens in C # ab

158

Ich muss den letzten Teil des aktuellen Verzeichnisses abrufen, zum Beispiel von /Users/smcho/filegen_from_directory/AIRPassthrough, den ich abrufen muss AIRPassthrough.

Mit Python kann ich es mit diesem Code bekommen.

import os.path

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

Oder

print os.path.basename(path)

Wie kann ich dasselbe mit C # machen?

HINZUGEFÜGT

Mit Hilfe der Antwortenden fand ich, was ich brauchte.

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

oder

string fullPath = Path.GetFullPath(fullPath).TrimEnd(Path.DirectorySeparatorChar);
string projectName = Path.GetFileName(fullPath);
prosseek
quelle
1
In Python sollten Sie lieber tun os.path.basename(path).
ReneSac

Antworten:

132

Du suchst Path.GetFileName.
Beachten Sie, dass dies nicht funktioniert, wenn der Pfad mit a endet \.

SLaks
quelle
3
@anti: Falsch; Ich versuchte es. Strings sind Strings. Fügen Sie es Path.GetFileName("/Users/smcho/filegen_from_directory/AIRPassthrough")in LINQPad ein, wenn Sie mir nicht glauben.
SLaks
@antisanity Nein, es wird der Verzeichnisname zurückgegeben, aber es ist wahrscheinlich nicht genau das, worum es bei der Frage ging.
Jakob Möllås
@ Jakob: Angesichts des Titels denke ich, dass es darum geht.
SLaks
3
@Light: Es funktioniert ; Versuch es. Die PathKlasse behandelt beide Trennzeichen.
SLaks
31
Damit dies mit einem von Directory.GetDirectories abgerufenen Verzeichnis funktioniert, verwenden Sie: string directoryName = Path.GetFileName (directory.TrimEnd (Path.DirectorySeparatorChar));
Fatlad
184

Du könntest es versuchen:

var path = @"/Users/smcho/filegen_from_directory/AIRPassthrough/";
var dirName = new DirectoryInfo(path).Name;
Codybartfast
quelle
20
Mir gefällt das besser als die gewählte Antwort. (Ab) Die Verwendung von GetFileName ist semantisch falsch, da es sich um ein Verzeichnis handelt, das Sie abrufen möchten. Um GetFileName deterministisch zu machen, müssen Sie außerdem die Möglichkeit eines nachlaufenden Schrägstrichs oder Backslashs berücksichtigen und ihn abschneiden, was hässlich ist.
Simon Brangwin
var dirName = new DirectoryInfo (Path.GetDirectoryName (pathWithFilename)). Name // ist besser
Kernowcode
@kernowcode Ich glaube, das würde "filegen_from_directory" anstelle von "AIRPassthrough" zurückgeben, wie vom OP angefordert.
codybartfast
1
@ SimonBrangwin Ich dachte, alles ist eine Datei in Linux :)
Razor
12

Nun, um genau Ihre Frage Titel zu beantworten :-)

var lastPartOfCurrentDirectoryName = 
   Path.GetFileName(Environment.CurrentDirectory);
Jakob Möllås
quelle
12

Dies ist eine etwas andere Antwort, je nachdem, was Sie haben. Wenn Sie eine Liste von Dateien haben und den Namen des letzten Verzeichnisses abrufen müssen, in dem sich die Datei befindet, können Sie Folgendes tun:

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

Dies gibt "2938_parentid" zurück.

ProVega
quelle
8

Verwenden Sie stattdessen das '/', damit der Aufruf aufgeteilt wird. Verwenden Sie besser das Path.DirectorySeparatorChar:

wie so:

path.split(Path.DirectorySeparatorChar).Last() 
Muad'Dib
quelle
1
Eine Sache, die ich an dieser Lösung nicht mag, ist, dass davon ausgegangen wird, woher die Zeichenfolge kommt. Was ist, wenn sie * nix-Protokolle auf einem Windows-System lesen? Dann wird das falsche Zeichen verwendet und Sie erhalten den gesamten Pfad und nicht den beabsichtigten Effekt. Nur meine 2 Cent.
Bob G.
Da stimme ich Ihnen zu. Das OP sagte "letzter Teil des aktuellen Verzeichnisses", daher ist dies in Ordnung.
Muad'Dib
6
var lastFolderName = Path.GetFileName(
    path.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar));

Dies funktioniert, wenn der Pfad zufällig Schrägstriche oder Schrägstriche enthält.

Holf
quelle
1
Es sieht aus wie string.TrimEnd () akzeptiert mehrere Zeichen, sodass nicht mehrere Aufrufe verwendet werden müssen. msdn.microsoft.com/en-us/library/…
Kyle Delaney
1
@ KyleDelaney so tut es! Antwort angepasst.
Holf
1
Es ist ein params-Array, .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)funktioniert also auch.
Kyle Delaney
1
Die angewendete Position von .TrimEnd () ist falsch. Es sollte auf den Pfad angewendet werden , nicht auf Path.GetFileName . Siehe die Antwort von @Fatlad
Tony
2

Versuche dies:

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

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

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

Der Code ist möglicherweise deaktiviert (ich habe ihn nicht getestet), aber die Idee sollte funktionieren

Stanley Cup Phil
quelle
1

Das funktioniert bei mir einwandfrei :)

Path.GetFileName(path.TrimEnd('\\')
Akshay
quelle
0

Sie können den folgenden Code ausprobieren:

Path.GetFileName(userpath)

Code_Beginner
quelle
0

Sie können auch die Uri-Klasse verwenden.

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

Sie können diese Klasse bevorzugen, wenn Sie ein anderes Segment abrufen möchten oder wenn Sie dasselbe mit einer Webadresse tun möchten.

Chris
quelle