Obter o (última parte do) nome do diretório atual em C #

158

Preciso obter a última parte do diretório atual, por exemplo /Users/smcho/filegen_from_directory/AIRPassthrough, preciso obter AIRPassthrough.

Com python, posso obtê-lo com este código.

import os.path

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

Ou

print os.path.basename(path)

Como posso fazer a mesma coisa com c #?

ADICIONADO

Com a ajuda dos respondentes, encontrei o que precisava.

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

ou

string fullPath = Path.GetFullPath(fullPath).TrimEnd(Path.DirectorySeparatorChar);
string projectName = Path.GetFileName(fullPath);
prosseek
fonte
1
Em python, você deve preferir os.path.basename(path).
ReneSac

Respostas:

132

Você está procurando Path.GetFileName.
Observe que isso não funcionará se o caminho terminar em a \.

SLaks
fonte
3
@anti: Errado; Eu tentei. Strings são strings. Cole Path.GetFileName("/Users/smcho/filegen_from_directory/AIRPassthrough")no LINQPad se não acredita em mim.
SLaks
@antisanity Não, ele retornará o nome do diretório, mas provavelmente não é exatamente do que se tratava a pergunta.
Jakob Möllås
@ Jakob: Dado o título, acho que é disso que se trata.
SLaks
3
@Light: Ele faz o trabalho; tente. A Pathclasse lida com os dois separadores.
SLaks
31
Para ter esse trabalho com um diretório recuperado por Directory.GetDirectories, use: string directoryName = Path.GetFileName (directory.TrimEnd (Path.DirectorySeparatorChar));
Fatlad 25/09
185

Você poderia tentar:

var path = @"/Users/smcho/filegen_from_directory/AIRPassthrough/";
var dirName = new DirectoryInfo(path).Name;
codybartfast
fonte
20
Eu gosto disso melhor do que a resposta escolhida. (Ab) usar GetFileName é semanticamente errado, pois é um diretório que você está tentando recuperar. Além disso, para tornar GetFileName determinístico, você deve considerar a possibilidade de uma barra ou barra invertida à direita e apará-la, o que é feio.
Simon Brangwin
var dirName = new DirectoryInfo (Path.GetDirectoryName (pathWithFilename)). Name // é melhor
kernowcode
@kernowcode Acredito que voltaria "filegen_from_directory" em vez de '' AIRPassthrough", conforme solicitado pelo OP.
codybartfast
1
@SimonBrangwin Eu pensei que tudo é um arquivo no Linux :)
Navalha
12

Bem, para responder exatamente ao título da sua pergunta :-)

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

Esta é uma resposta ligeiramente diferente, dependendo do que você tem. Se você possui uma lista de arquivos e precisa obter o nome do último diretório em que o arquivo está, você pode fazer isso:

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

Isso retornará "2938_parentid"

ProVega
fonte
8

em vez de usar o '/' para a chamada ser dividida, é melhor usar o Path.DirectorySeparatorChar:

igual a:

path.split(Path.DirectorySeparatorChar).Last() 
Muad'Dib
fonte
1
Uma coisa que eu não gosto em usar esta solução é que ela assume como a origem da string. E se eles estiverem lendo logs * nix em um sistema Windows? Em seguida, o caractere errado será utilizado e você terminará com o caminho inteiro, em vez do efeito pretendido. Apenas meus 2 centavos.
Bob G
Eu concordo com você nisso. o OP disse 'última parte do diretório atual', portanto, para isso, tudo bem.
Muad'Dib
6
var lastFolderName = Path.GetFileName(
    path.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar));

Isso funciona se o caminho contiver separadores de barra invertida ou separadores de barra invertida.

Holf
fonte
1
Parece que string.TrimEnd () aceita vários caracteres, portanto, não há necessidade de usar várias chamadas. msdn.microsoft.com/en-us/library/…
Kyle Delaney
1
@KyleDelaney assim faz! Resposta ajustada.
Holf
1
É uma matriz de parâmetros, também .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)funciona.
Kyle Delaney
1
O local aplicado de .TrimEnd () está incorreto. Deve ser aplicado ao caminho , não ao Path.GetFileName . Veja a resposta de @Fatlad
Tony
2

Tente o seguinte:

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

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

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

O código pode estar desativado (não testei), mas a ideia deve funcionar

Stanley Cup Phil
fonte
1

Isso funciona perfeitamente bem comigo :)

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

Você pode tentar o código abaixo:

Path.GetFileName(userpath)

Code_Beginner
fonte
0

Você também pode usar a classe Uri.

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

Você pode preferir usar essa classe se desejar obter outro segmento ou se quiser fazer a mesma coisa com um endereço da web.

Chris
fonte