Obtenir le nom du dossier à partir du chemin complet du fichier

116

Comment obtenir le nom du dossier à partir du chemin complet de l'application?

C'est le chemin du fichier ci-dessous,

c:\projects\root\wsdlproj\devlop\beta2\text

Ici, "texte" est le nom du dossier.

Comment puis-je obtenir ce nom de dossier à partir de ce chemin?

Vasmay
la source

Réponses:

205

Voir DirectoryInfo.Name :

string dirName = new DirectoryInfo(@"c:\projects\roott\wsdlproj\devlop\beta2\text").Name;
Alex Pacurar
la source
Cela ne nécessite-t-il pas que le dossier existe réellement dans le système de fichiers (le nom du dossier serait toujours "texte" pour ce chemin d'accès complet si le dossier "c: \ projects \ root \ wsdlproj \ devlop \ beta2 \ text" ne le fait pas ( actuellement) existent dans le système de fichiers)?
Peter Mortensen le
@PeterMortensen, non. Je viens de tester cela et la méthode renvoie le nom du dossier de niveau le plus bas de la chaîne, même si le chemin du dossier n'existe pas.
vbguyny
1
Merci, bonne réponse. Mais je suis un peu perplexe que System.IO.Directory ne prend pas en charge une telle opération.
anhoppe du
1
@anhoppe - Je suis d'accord. Une autre option que j'ai vue est Path.GetDirectoryName msdn.microsoft.com/en-us/library / ... - mais je ne pourrai pas le tester avant demain.
Don Cheadle
30

Je pense que vous voulez obtenir le nom du dossier parent à partir du chemin du fichier. C'est facile à obtenir. Une méthode consiste à créer un FileInfoobjet type et à utiliser sa Directorypropriété.

Exemple:

FileInfo fInfo = new FileInfo("c:\projects\roott\wsdlproj\devlop\beta2\text\abc.txt");

String dirName = fInfo.Directory.Name;
Shekhar
la source
16

Essaye ça

var myFolderName = @"c:\projects\roott\wsdlproj\devlop\beta2\text";
var result = Path.GetFileName(myFolderName);
Øyvind Bråthen
la source
si vous avez un nom de fichier dans une chaîne, il renvoie également le nom de fichier
swissben
1
Dans ce cas, le texte est le nom de fichier (sans extension). Je pensais que c'était ce qu'était le PO. Si c'est un dossier ou un nom de fichier n'a pas vraiment d'importance. Si la chaîne ne contient pas le nom du fichier, ce code lui donnera ce qu'il cherche.
Øyvind Bråthen
4
À moins que les chemins ne se terminent par un \ comme celui-ci:@"c:\projects\roott\wsdlproj\devlop\beta2\text\"
Kristof Claes
1
cela ne fonctionne pas pour un dossier. J'obtiens une chaîne vide. Il doit y avoir un fichier présent
BraveNewMath
3
Cela fonctionne très bien si le chemin du dossier ne contient pas de barre oblique inverse de fin (comme par exemple un chemin de dossier renvoyé par Path.GetDirectoryName () ). Le nom de cette fonction, GetFileName (), est cependant un peu trompeur.
Peter Mortensen le
9

Vous pouvez utiliser ceci:

string path = @"c:\projects\roott\wsdlproj\devlop\beta2\text";
string lastDirectory = path.Split(new char[] { System.IO.Path.DirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries).Last();
Kristof Claes
la source
et si le chemin ressemble à ceci: @ "c: \ projects \ roott \ wsdlproj \ devlop \ beta2 \ text \", donc avec un DirectorySeparatorChar supplémentaire
Alex Pacurar
1
@Alex - J'ai modifié mon code pour qu'il fonctionne également avec ce genre de chemins. StringSplitOptions.RemoveEmptyEntriesfait l'affaire.
Kristof Claes
Selon msdn.microsoft.com/en-us/library/… , FileInfo peut lever une exception si l'autorisation requise n'est pas donnée.
Daniel B
5

Utilisez simplement Path.GetFileName

Ici - Extrayez le nom du dossier du chemin complet d'un dossier:

string folderName = Path.GetFileName(@"c:\projects\root\wsdlproj\devlop\beta2\text");//Return "text"

Voici quelques extras - Extrayez le nom du dossier du chemin complet d'un fichier:

string folderName = Path.GetFileName(Path.GetDirectoryName(@"c:\projects\root\wsdlproj\devlop\beta2\text\GTA.exe"));//Return "text"
123iamking
la source
3

Je me suis dit qu'il n'y avait pas d'autre moyen que d'aller dans le système de fichiers pour savoir si text.txt était un répertoire ou juste un fichier. Si vous vouliez quelque chose de simple, vous pouvez peut-être simplement utiliser:

s.Substring(s.LastIndexOf(@"\"));
Zuoanqh
la source
1
Pour éviter une barre oblique au début de la chaîne: s.Substring (s.LastIndexOf (@ "\") + 1);
David Yates
2

Dans ce cas, le fichier que vous souhaitez obtenir est stocké dans la variable strpath:

string strPath = Server.MapPath(Request.ApplicationPath) + "/contents/member/" + strFileName;
Krishna
la source
2

Voici une méthode alternative qui a fonctionné pour moi sans avoir à créer un objet DirectoryInfo. Le point clé est que cela GetFileName()fonctionne lorsqu'il n'y a pas de barre oblique de fin dans le chemin.

var name = Path.GetFileName(path.TrimEnd(Path.DirectorySeparatorChar));

Exemple:

var list = Directory.EnumerateDirectories(path, "*")
        .Select(p => new
        {
            id = "id_" + p.GetHashCode().ToString("x"),
            text = Path.GetFileName(p.TrimEnd(Path.DirectorySeparatorChar)),
            icon = "fa fa-folder",
            children = true
        })
        .Distinct()
        .OrderBy(p => p.text);
Roberto
la source
1

Cela peut également être fait comme ça;

var directoryName = System.IO.Path.GetFileName(@"c:\projects\roott\wsdlproj\devlop\beta2\text");
Steve Cooper
la source
cela renverra une chaîne vide
disklosr
@disklosr - vient de tester avec ScriptCs et il renvoie 'text'
Steve Cooper
2
Cela fonctionne très bien si le chemin du dossier ne contient pas de barre oblique inverse de fin (comme par exemple un chemin de dossier renvoyé par Path.GetDirectoryName () ). Le nom de cette fonction, GetFileName (), est cependant un peu trompeur.
Peter Mortensen le
0

Basé sur les réponses précédentes (mais corrigé)

using static System.IO.Path;

var dir = GetFileName(path?.TrimEnd(DirectorySeparatorChar, AltDirectorySeparatorChar));

Explication de GetFileNamede la source .NET :

Renvoie le nom et les parties d'extension du chemin donné. La chaîne résultante contient les caractères du chemin qui suivent le dernier caractère barre oblique inverse ("\"), barre oblique ("/") ou deux-points (":") dans le chemin. La chaîne résultante est le chemin d'accès complet si le chemin ne contient pas de barre oblique inverse après la suppression des barres obliques, des barres obliques ou des deux-points de fin. La chaîne résultante est nulle si le chemin est nul.

marsze
la source
-3
Path.GetDirectoryName(@"c:\projects\roott\wsdlproj\devlop\beta2\text");

MSDN: méthode Path.GetDirectoryName

swissben
la source
11
Cela reviendra c:\projects\roott\wsdlproj\devlop\beta2, et ce n'est pas ce que le PO recherchait.
Øyvind Bråthen