Récupère la (dernière partie du) nom du répertoire actuel en C #

158

J'ai besoin d'obtenir la dernière partie du répertoire actuel, par exemple à partir de /Users/smcho/filegen_from_directory/AIRPassthrough, je dois obtenir AIRPassthrough.

Avec python, je peux l'obtenir avec ce code.

import os.path

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

Ou

print os.path.basename(path)

Comment puis-je faire la même chose avec C #?

AJOUTÉE

Avec l'aide des répondeurs, j'ai trouvé ce dont j'avais besoin.

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
la source
1
En python, vous devriez plutôt faire os.path.basename(path).
ReneSac

Réponses:

132

Vous cherchez Path.GetFileName.
Notez que cela ne fonctionnera pas si le chemin se termine par un \.

SLaks
la source
3
@anti: faux; Je l'ai essayé. Les chaînes sont des chaînes. Collez Path.GetFileName("/Users/smcho/filegen_from_directory/AIRPassthrough")dans LINQPad si vous ne me croyez pas.
SLaks
@antisanity Non, il renverra le nom du répertoire, mais ce n'est probablement pas exactement le sujet de la question.
Jakob Möllås
@Jakob: Compte tenu du titre, je pense que c'est de cela qu'il s'agit.
SLaks
3
@Light: ça marche; essayez-le. La Pathclasse gère les deux séparateurs.
SLaks
31
Pour que cela fonctionne avec un répertoire récupéré par Directory.GetDirectories, utilisez: string directoryName = Path.GetFileName (directory.TrimEnd (Path.DirectorySeparatorChar));
Fatlad
185

Tu pourrais essayer:

var path = @"/Users/smcho/filegen_from_directory/AIRPassthrough/";
var dirName = new DirectoryInfo(path).Name;
codybartfast
la source
20
J'aime mieux cela que la réponse choisie. (Ab) l'utilisation de GetFileName est sémantiquement erronée car c'est un répertoire que vous essayez de récupérer. De plus, rendre GetFileName déterministe signifie que vous devez tenir compte de la possibilité d'une barre oblique ou d'une barre oblique inverse de fin et de la couper, ce qui est moche.
Simon Brangwin
var dirName = new DirectoryInfo (Path.GetDirectoryName (pathWithFilename)). Name // est meilleur
kernowcode
@kernowcode Je pense que cela renverrait "filegen_from_directory" au lieu de "AIRPassthrough" comme demandé par l'OP.
codybartfast
1
@SimonBrangwin Je pensais que tout était un fichier sous Linux :)
Razor
12

Eh bien, pour répondre exactement au titre de votre question :-)

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

C'est une réponse légèrement différente, selon ce que vous avez. Si vous avez une liste de fichiers et que vous avez besoin d'obtenir le nom du dernier répertoire dans lequel se trouve le fichier, vous pouvez le faire:

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

Cela renverra "2938_parentid"

ProVega
la source
8

plutôt que d'utiliser le '/' pour l'appel à fractionner, mieux vaut utiliser le Path.DirectorySeparatorChar:

ainsi:

path.split(Path.DirectorySeparatorChar).Last() 
Muad'Dib
la source
1
Une chose que je n'aime pas dans l'utilisation de cette solution est qu'elle suppose d'où vient la chaîne. Et s'ils lisent les journaux * nix sur un système Windows? Ensuite, le mauvais caractère sera utilisé et vous vous retrouverez avec le chemin complet, plutôt que l'effet escompté. Juste mes 2 cents.
Bob G
Je suis d'accord avec vous sur ce point. l'OP a dit «dernière partie du répertoire courant» donc pour cela, c'est très bien.
Muad'Dib
6
var lastFolderName = Path.GetFileName(
    path.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar));

Cela fonctionne si le chemin contient des séparateurs de barre oblique avant ou des séparateurs de barre oblique inverse.

Holf
la source
1
Cela ressemble à string.TrimEnd () accepte plusieurs caractères, il n'est donc pas nécessaire d'utiliser plusieurs appels. msdn.microsoft.com/en-us/library/…
Kyle Delaney
1
@KyleDelaney c'est ce qu'il fait! Réponse ajustée.
Holf
1
C'est un tableau de paramètres, donc ça .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)marche aussi.
Kyle Delaney
1
L'emplacement appliqué de .TrimEnd () est incorrect. Il doit être appliqué au chemin , pas à Path.GetFileName . Voir la réponse de @Fatlad
Tony
2

Essaye ça:

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

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

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

Le code est peut-être désactivé (je ne l'ai pas testé) mais l'idée devrait fonctionner

Coupe Stanley Phil
la source
1

Cela fonctionne parfaitement bien avec moi :)

Path.GetFileName(path.TrimEnd('\\')
Akshay
la source
0

Vous pouvez essayer le code ci-dessous:

Path.GetFileName(userpath)

Code_Beginner
la source
0

Vous pouvez également utiliser la classe Uri.

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

Vous pouvez préférer utiliser cette classe si vous souhaitez obtenir un autre segment, ou si vous souhaitez faire la même chose avec une adresse Web.

Chris
la source