Obtenga la (última parte del) nombre del directorio actual en C #

158

Necesito obtener la última parte del directorio actual, por ejemplo /Users/smcho/filegen_from_directory/AIRPassthrough, necesito obtener AIRPassthrough.

Con python, puedo obtenerlo con este código.

import os.path

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

O

print os.path.basename(path)

¿Cómo puedo hacer lo mismo con C #?

ADICIONAL

Con la ayuda de los que respondieron, encontré lo que necesitaba.

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);
prosseek
fuente
1
En python, deberías hacerlo os.path.basename(path).
ReneSac

Respuestas:

132

Usted está buscando Path.GetFileName.
Tenga en cuenta que esto no funcionará si la ruta termina en a \.

SLaks
fuente
3
@anti: Incorrecto; Lo intenté. Las cuerdas son cuerdas. Pega Path.GetFileName("/Users/smcho/filegen_from_directory/AIRPassthrough")en LINQPad si no me crees.
Fugas
@antisanity No, devolverá el nombre del directorio, pero probablemente no es exactamente de lo que se trataba la pregunta.
Jakob Möllås
@Jakob: Dado el título, creo que de esto se trata la pregunta.
Fugas
3
@Light: Se hace el trabajo; intentalo. La Pathclase maneja ambos separadores.
Fugas
31
Para que esto funcione con un directorio recuperado por Directory.GetDirectories use: string directoryName = Path.GetFileName (directory.TrimEnd (Path.DirectorySeparatorChar));
Fatlad
185

Tu podrías intentar:

var path = @"/Users/smcho/filegen_from_directory/AIRPassthrough/";
var dirName = new DirectoryInfo(path).Name;
codybartfast
fuente
20
Me gusta más que la respuesta elegida. (Ab) el uso de GetFileName es semánticamente incorrecto ya que es un directorio que está intentando recuperar. Además, para que GetFileName sea determinista significa que debe tener en cuenta la posibilidad de una barra diagonal o barra diagonal inversa posterior, y recortarlo, lo cual es feo.
Simon Brangwin
var dirName = new DirectoryInfo (Path.GetDirectoryName (pathWithFilename)). Name // es mejor
kernowcode el
@kernowcode Creo que eso devolvería "filegen_from_directory" en lugar de '' AIRPassthrough "como lo solicitó el OP.
codybartfast
1
@SimonBrangwin Pensé que todo es un archivo en Linux :)
Razor
12

Bueno, para responder exactamente el título de tu pregunta :-)

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

Esta es una respuesta ligeramente diferente, dependiendo de lo que tenga. Si tiene una lista de archivos y necesita obtener el nombre del último directorio en el que se encuentra el archivo, puede hacer esto:

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

Esto devolverá "2938_parentid"

ProVega
fuente
8

en lugar de usar el '/' para que la llamada se divida, mejor usar el Path.DirectorySeparatorChar:

al igual que:

path.split(Path.DirectorySeparatorChar).Last() 
Muad'Dib
fuente
1
Una cosa que no me gusta de usar esta solución es que supone que de dónde viene la cadena. ¿Qué sucede si están leyendo registros * nix en un sistema Windows? Entonces se utilizará el personaje equivocado y terminarás con todo el camino, en lugar del efecto deseado. Solo mis 2 centavos.
Bob G
Estoy de acuerdo contigo en esto. el OP dijo 'última parte del directorio actual' así que para eso, esto está bien.
Muad'Dib
6
var lastFolderName = Path.GetFileName(
    path.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar));

Esto funciona si la ruta contiene separadores de barra diagonal o separadores de barra diagonal inversa.

Holf
fuente
1
Parece una cadena. TrimEnd () acepta varios caracteres, por lo que no es necesario usar varias llamadas. msdn.microsoft.com/en-us/library/…
Kyle Delaney
1
@KyleDelaney ¡así es! Respuesta ajustada.
Holf
1
Es una matriz de parámetros, por lo que .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)también funciona.
Kyle Delaney
1
La ubicación aplicada de .TrimEnd () es incorrecta. Debe aplicarse a la ruta , no a Path.GetFileName . Ver la respuesta de @Fatlad
Tony
2

Prueba esto:

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

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

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

El código puede estar apagado (no lo he probado) pero la idea debería funcionar

Stanley Cup Phil
fuente
1

Esto funciona perfectamente bien conmigo :)

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

Puedes probar el siguiente código:

Path.GetFileName(userpath)

Code_Beginner
fuente
0

También puedes usar la clase Uri.

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

Es posible que prefiera utilizar esta clase si desea obtener otro segmento o si desea hacer lo mismo con una dirección web.

Chris
fuente