Obtener el nombre de la carpeta de una ruta


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

¿De qué objetos o métodos podría usar que me darían un resultado folder2?


55
¿Desea el último nombre de carpeta, por lo que si tenía C: \ folder1 \ folder2 \ folder3 \ file.txt, quiere "folder3"?
Steve Danner

Respuestas:


336

Probablemente usaría algo como:

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

La llamada interna a GetDirectoryNamedevolverá la ruta completa, mientras que la llamada externa a GetFileName()devolverá el último componente de ruta, que será el nombre de la carpeta.

Este enfoque funciona independientemente de si la ruta existe o no. Sin embargo, este enfoque se basa en la ruta que inicialmente termina en un nombre de archivo. Si no se sabe si la ruta termina en un nombre de archivo o nombre de carpeta, entonces se requiere que verifique la ruta real para ver si existe primero un archivo / carpeta en la ubicación. En ese caso, la respuesta de Dan Dimitru puede ser más apropiada.


133
Otra solución: devolver un nuevo DirectoryInfo (fullPath) .Name;
Davide Icardi

1
La solución de Davide Icardi funcionó mejor para mí porque tenía caminos relativos. Gracias.
akatran

44
@DavideIcardi Tu comentario realmente debería ser una respuesta, vale la pena.
Ondrej Janacek

3
Esto no funciona cuando la ruta no incluye un archivo (una ruta a un directorio), mientras que la solución @DavideIcardi sí.
Aage

66
ADVERTENCIA: esta solución está mal! Para "C: / bin / logs" devuelve "bin". Utilice return new DirectoryInfo (fullPath) .Name; en lugar.
Chris W

36

Prueba esto:

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

23

Simple y limpio. Solo usa System.IO.FileSystem- funciona como un encanto:

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

3
carpeta en este caso sería file.txt, y nofolder2
TJ Rockefeller

13

DirectoryInfo hace el trabajo para eliminar el nombre del directorio

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

7

Usé este fragmento de código para obtener el directorio de una ruta cuando no hay un nombre de archivo en la ruta:

por ejemplo "c: \ tmp \ test \ visual";

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

Salida:

visual


Simplemente puede hacer Path.GetFileName (dir) y devolverá el nombre de la carpeta muy bien.
jrich523

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

2

También es importante tener en cuenta que al obtener una lista de nombres de directorio en un bucle, la DirectoryInfoclase se inicializa una vez, lo que permite solo la llamada por primera vez. Para evitar esta limitación, asegúrese de usar variables dentro de su ciclo para almacenar el nombre de cualquier directorio individual.

Por ejemplo, este código de muestra recorre una lista de directorios dentro de cualquier directorio padre mientras agrega cada nombre de directorio encontrado dentro de una Lista de tipo de cadena:

[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

El siguiente código ayuda a obtener solo el nombre de la carpeta

 elementos public ObservableCollection = new ObservableCollection ();

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

                }

            }
            captura (excepción a)
            {

            }
  gridItems de clase pública
    {
        nombre de carpeta de cadena pública {get; conjunto; }
        public string folderpath {get; conjunto; }
    }

0

Esto es feo pero evita las asignaciones:

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;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.