Ottenere il nome della cartella da un percorso


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

Quali oggetti o metodi potrei usare per ottenere un risultato folder2?


5
Desideri il nome dell'ultima cartella, quindi se avessi C: \ cartella1 \ cartella2 \ cartella3 \ file.txt, vuoi "cartella3"?
Steve Danner,

Risposte:


335

Probabilmente userei qualcosa del tipo:

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

La chiamata interna a GetDirectoryNamerestituirà il percorso completo, mentre la chiamata esterna GetFileName()restituirà l'ultimo componente del percorso, che sarà il nome della cartella.

Questo approccio funziona indipendentemente dal fatto che il percorso esista effettivamente. Questo approccio, tuttavia, si basa sul percorso che termina inizialmente con un nome file. Se non è noto se il percorso termina con un nome file o cartella, è necessario verificare il percorso effettivo per vedere se esiste un file / cartella nella posizione prima. In tal caso, la risposta di Dan Dimitru potrebbe essere più appropriata.


133
Un'altra soluzione: restituire nuovo DirectoryInfo (fullPath) .Name;
Davide Icardi,

1
La soluzione di Davide Icardi ha funzionato meglio per me perché avevo percorsi relativi. Grazie.
Akatran,

4
@DavideIcardi Il tuo commento dovrebbe davvero essere una risposta, ne vale la pena.
Ondrej Janacek,

3
Questo non funziona quando il percorso non include un file (un percorso di una directory), mentre la soluzione @DavideIcardi funziona.
Aage,

6
ATTENZIONE: questa soluzione è sbagliata! Per "C: / bin / logs" restituisce "bin". Utilizzare return new DirectoryInfo (fullPath) .Name; anziché.
Chris W,

36

Prova questo:

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

23

Semplice e pulito Utilizza solo System.IO.FileSystem- funziona come un fascino:

string path = "C:/folder1/folder2/file.txt";
string folder = new DirectoryInfo(path).Name;

3
cartella in questo caso sarebbe file.txt, e nonfolder2
TJ Rockefeller il

13

DirectoryInfo fa il lavoro per eliminare il nome della directory

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

7

Ho usato questo frammento di codice per ottenere la directory per un percorso quando non è presente alcun nome file nel percorso:

ad esempio "c: \ tmp \ test \ visual";

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

Produzione:

visivo


Puoi semplicemente fare Path.GetFileName (dir) e restituirà il nome della cartella bene.
jrich523,

3
var fullPath = @"C:\folder1\folder2\file.txt";
var lastDirectory = Path.GetDirectoryName(fullPath).Split('\\').LastOrDefault();

2

È anche importante notare che mentre si ottiene un elenco di nomi di directory in un ciclo, la DirectoryInfoclasse viene inizializzata una volta consentendo così solo la prima chiamata. Per aggirare questa limitazione, assicurarsi di utilizzare le variabili all'interno del proprio ciclo per memorizzare il nome di ogni singola directory.

Ad esempio, questo codice di esempio scorre in un elenco di directory all'interno di qualsiasi directory padre mentre aggiunge ogni nome di directory trovato all'interno di un Elenco di tipo stringa:

[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

1

Il codice seguente aiuta a ottenere solo il nome della cartella

 oggetti pubblici ObservableCollection = new ObservableCollection ();

   provare
            {
                string [] folderPaths = Directory.GetDirectories (stemp);
                items.Clear ();
                foreach (stringa s in folderPaths)
                {
                    items.Add (new gridItems {foldername = s.Remove (0, s.LastIndexOf ('\\') + 1), folderpath = s});

                }

            }
            cattura (eccezione a)
            {

            }
  gridItems di classe pubblica
    {
        public string foldername {get; impostato; }
        percorso cartella pubblica stringa {get; impostato; }
    }

0

Questo è brutto ma evita le allocazioni:

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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.