Ottieni (ultima parte di) il nome della directory corrente in C #


158

Ho bisogno di ottenere l'ultima parte della directory corrente, ad esempio /Users/smcho/filegen_from_directory/AIRPassthrough, ho bisogno di ottenere AIRPassthrough.

Con Python, posso ottenerlo con questo codice.

import os.path

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

O

print os.path.basename(path)

Come posso fare la stessa cosa con C #?

AGGIUNTO

Con l'aiuto dei rispondenti, ho trovato quello di cui avevo bisogno.

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

o

string fullPath = Path.GetFullPath(fullPath).TrimEnd(Path.DirectorySeparatorChar);
string projectName = Path.GetFileName(fullPath);


1
In Python, dovresti piuttosto farlo os.path.basename(path).
ReneSac,

Risposte:


132

Stai cercando Path.GetFileName.
Nota che questo non funzionerà se il percorso termina in a \.


3
@anti: sbagliato; L'ho provato. Le stringhe sono stringhe. Incolla Path.GetFileName("/Users/smcho/filegen_from_directory/AIRPassthrough")in LINQPad se non mi credi.
SLaks,

@antisanity No, restituirà il nome della directory, ma probabilmente non è esattamente la questione.
Jakob Möllås,

@Jakob: dato il titolo, penso che sia questa la domanda.
SLaks,

3
@Light: Si fa il lavoro; Provalo. La Pathclasse gestisce entrambi i separatori.
SLaks,

31
Per fare in modo che funzioni con una directory recuperata da Directory.GetDirectories, utilizzare: string directoryName = Path.GetFileName (directory.TrimEnd (Path.DirectorySeparatorChar));
Fatlad,

185

Puoi provare:

var path = @"/Users/smcho/filegen_from_directory/AIRPassthrough/";
var dirName = new DirectoryInfo(path).Name;

20
Mi piace di più della risposta scelta. (Ab) l'utilizzo di GetFileName è semanticamente errato poiché è una directory che stai tentando di recuperare. Inoltre, per rendere deterministico GetFileName significa che devi tenere conto della possibilità di una barra rovesciata o di una barra rovesciata finale e tagliarla, il che è brutto.
Simon Brangwin,

var dirName = new DirectoryInfo (Path.GetDirectoryName (pathWithFilename)). Nome // è meglio
kernowcode

@kernowcode Credo che restituirebbe "filegen_from_directory" invece di "AIRPassthrough" come richiesto dall'OP.
codybartfast

1
@SimonBrangwin Ho pensato che tutto fosse un file in Linux :)
Rasoio

12

Bene, per rispondere esattamente al titolo della tua domanda :-)

var lastPartOfCurrentDirectoryName = 
   Path.GetFileName(Environment.CurrentDirectory);

12

Questa è una risposta leggermente diversa, a seconda di ciò che hai. Se hai un elenco di file e devi ottenere il nome dell'ultima directory in cui si trova il file, puoi farlo:

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

Questo restituirà "2938_parentid"


8

piuttosto che usare '/' per dividere la chiamata, meglio usare Path.DirectorySeparatorChar:

così:

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

1
Una cosa che non mi piace dell'uso di questa soluzione è che fa un'ipotesi sulla provenienza della stringa. Cosa succede se stanno leggendo i log * nix su un sistema Windows? Quindi verrà utilizzato il personaggio sbagliato e finirai con l'intero percorso, anziché con l'effetto desiderato. Solo i miei 2 centesimi.
Bob G,

sono d'accordo con te su questo. l'OP ha detto "ultima parte della directory corrente", quindi per questo va bene.
Muad'Dib,

6
var lastFolderName = Path.GetFileName(
    path.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar));

Funziona se il percorso contiene separatori di barra o separatori di barra rovesciata.


1
Sembra string.TrimEnd () accetta più caratteri, quindi non è necessario utilizzare più chiamate. msdn.microsoft.com/en-us/library/…
Kyle Delaney,

1
@KyleDelaney così fa! Risposta modificata.
Holf,

1
È un array di parametri, quindi .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)funziona anche.
Kyle Delaney,

1
Il percorso applicato di .TrimEnd () non è corretto. Dovrebbe essere applicato al percorso , non a Path.GetFileName . Vedi la risposta di @Fatlad
Tony,

2

Prova questo:

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

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

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

Il codice potrebbe essere disattivato (non l'ho testato) ma l'idea dovrebbe funzionare


1

Questo funziona perfettamente con me :)

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


0

Puoi anche usare la classe Uri.

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

Puoi preferire usare questa classe se vuoi ottenere qualche altro segmento o se vuoi fare la stessa cosa con un indirizzo web.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.