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);


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 \.


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;

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);

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"


8

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

ainsi:

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

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.


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


1

Cela fonctionne parfaitement bien avec moi :)

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


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.