Obtenir le nom du dossier à partir d'un chemin

187
string path = "C:/folder1/folder2/file.txt";

Quels objets ou méthodes pourrais-je utiliser qui me donneraient un résultat folder2?

Ash Burlaczenko
la source
5
Voulez-vous le nom du dernier dossier, donc si vous aviez C: \ dossier1 \ dossier2 \ dossier3 \ fichier.txt, vous voulez "dossier3"?
Steve Danner

Réponses:

336

J'utiliserais probablement quelque chose comme:

string path = "C:/folder1/folder2/file.txt";
string lastFolderName = Path.GetFileName( Path.GetDirectoryName( path ) );

L'appel interne à GetDirectoryNamerenverra le chemin complet, tandis que l'appel externe à GetFileName()renverra le dernier composant de chemin - qui sera le nom du dossier.

Cette approche fonctionne, que le chemin existe ou non. Cette approche repose cependant sur le chemin se terminant initialement par un nom de fichier. Si vous ne savez pas si le chemin se termine par un nom de fichier ou un nom de dossier, vous devez d'abord vérifier le chemin réel pour voir si un fichier / dossier existe à l'emplacement. Dans ce cas, la réponse de Dan Dimitru peut être plus appropriée.

LBushkin
la source
134
Autre solution: retournez le nouveau DirectoryInfo (fullPath) .Name;
Davide Icardi
1
La solution de Davide Icardi a mieux fonctionné pour moi parce que j'avais des chemins relatifs. Merci.
akatran
4
@DavideIcardi Votre commentaire devrait vraiment être une réponse, ça vaut le coup.
Ondrej Janacek
3
Cela ne fonctionne pas lorsque le chemin n'inclut pas de fichier (un chemin vers un répertoire), contrairement à la solution @DavideIcardi.
Aage
6
ATTENTION: cette solution est fausse! Pour "C: / bin / logs", il renvoie "bin". Utilisez return new DirectoryInfo (fullPath) .Name; au lieu.
Chris W
36

Essaye ça:

string filename = @"C:/folder1/folder2/file.txt";
string FolderName = new DirectoryInfo(System.IO.Path.GetDirectoryName(filename)).Name;
Wahyu
la source
23

Simple et propre. Utilise uniquement System.IO.FileSystem- fonctionne comme un charme:

string path = "C:/folder1/folder2/file.txt";
string folder = new DirectoryInfo(path).Name;
susieloo_
la source
3
dossier dans ce cas serait file.txt, et nonfolder2
TJ Rockefeller
13

DirectoryInfo fait le travail pour supprimer le nom du répertoire

string my_path = @"C:\Windows\System32";
DirectoryInfo dir_info = new DirectoryInfo(my_path);
string directory = dir_info.Name;  // System32
Sayka
la source
7

J'ai utilisé cet extrait de code pour obtenir le répertoire d'un chemin lorsqu'aucun nom de fichier n'est dans le chemin:

par exemple "c: \ tmp \ test \ visual";

string dir = @"c:\tmp\test\visual";
Console.WriteLine(dir.Replace(Path.GetDirectoryName(dir) + Path.DirectorySeparatorChar, ""));

Production:

visuel

Mario
la source
Vous pouvez simplement faire Path.GetFileName (dir) et il renverra le nom du dossier très bien.
jrich523
3
var fullPath = @"C:\folder1\folder2\file.txt";
var lastDirectory = Path.GetDirectoryName(fullPath).Split('\\').LastOrDefault();
Shawn
la source
2

Il est également important de noter que lors de l'obtention d'une liste de noms de répertoires dans une boucle, la DirectoryInfoclasse est initialisée une fois, permettant ainsi uniquement un premier appel. Afin de contourner cette limitation, assurez-vous d'utiliser des variables dans votre boucle pour stocker le nom de tout répertoire individuel.

Par exemple, cet exemple de code parcourt une liste de répertoires dans n'importe quel répertoire parent tout en ajoutant chaque nom de répertoire trouvé dans une liste de type chaîne:

[C #]

string[] parentDirectory = Directory.GetDirectories("/yourpath");
List<string> directories = new List<string>();

foreach (var directory in parentDirectory)
{
    // Notice I've created a DirectoryInfo variable.
    DirectoryInfo dirInfo = new DirectoryInfo(directory);

    // And likewise a name variable for storing the name.
    // If this is not added, only the first directory will
    // be captured in the loop; the rest won't.
    string name = dirInfo.Name;

    // Finally we add the directory name to our defined List.
    directories.Add(name);
}

[VB.NET]

Dim parentDirectory() As String = Directory.GetDirectories("/yourpath")
Dim directories As New List(Of String)()

For Each directory In parentDirectory

    ' Notice I've created a DirectoryInfo variable.
    Dim dirInfo As New DirectoryInfo(directory)

    ' And likewise a name variable for storing the name.
    ' If this is not added, only the first directory will
    ' be captured in the loop; the rest won't.
    Dim name As String = dirInfo.Name

    ' Finally we add the directory name to our defined List.
    directories.Add(name)

Next directory
Willy Kimura
la source
1

Le code ci-dessous permet d'obtenir uniquement le nom du dossier

 public ObservableCollection items = new ObservableCollection ();

   essayer
            {
                string [] folderPaths = Directory.GetDirectories (stemp);
                items.Clear ();
                foreach (chaîne s dans folderPaths)
                {
                    items.Add (new gridItems {foldername = s.Remove (0, s.LastIndexOf ('\\') + 1), folderpath = s});

                }

            }
            catch (exception a)
            {

            }
  grille de classe publique
    {
        public string nomdossier {get; ensemble; }
        chemin du dossier de chaîne publique {get; ensemble; }
    }
Joee
la source
0

C'est moche mais évite les allocations:

private static string GetFolderName(string path)
{
    var end = -1;
    for (var i = path.Length; --i >= 0;)
    {
        var ch = path[i];
        if (ch == System.IO.Path.DirectorySeparatorChar ||
            ch == System.IO.Path.AltDirectorySeparatorChar ||
            ch == System.IO.Path.VolumeSeparatorChar)
        {
            if (end > 0)
            {
                return path.Substring(i + 1, end - i - 1);
            }

            end = i;
        }
    }

    if (end > 0)
    {
        return path.Substring(0, end);
    }

    return path;
}
Johan Larsson
la source