Obtendo o nome da pasta de um caminho

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

De quais objetos ou métodos eu poderia usar que me dariam resultado folder2?

Ash Burlaczenko
fonte
5
Você está querendo o último nome da pasta, então, se você tivesse C: \ folder1 \ folder2 \ folder3 \ file.txt, deseja "folder3"?
Steve Danner

Respostas:

335

Eu provavelmente usaria algo como:

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

A chamada interna para GetDirectoryNameretornará o caminho completo, enquanto a chamada externa GetFileName()retornará o último componente do caminho - que será o nome da pasta.

Essa abordagem funciona se o caminho realmente existe ou não. Essa abordagem, no entanto, depende do caminho que termina inicialmente em um nome de arquivo. Se não se sabe se o caminho termina em um nome de arquivo ou pasta - é necessário que você verifique o caminho real para ver se existe um arquivo / pasta no local primeiro. Nesse caso, a resposta de Dan Dimitru pode ser mais apropriada.

LBushkin
fonte
133
Outra solução: retornar novo DirectoryInfo (fullPath) .Name;
Davide Icardi
1
A solução de Davide Icardi funcionou melhor para mim porque eu tinha caminhos relativos. Obrigado.
akatran
4
@DavideIcardi Seu comentário realmente deve ser uma resposta, vale a pena.
Ondrej Janacek
3
Isso não funciona quando o caminho não inclui um arquivo (um caminho para um diretório), enquanto a solução @DavideIcardi faz.
Aage
6
AVISO: esta solução está errada! Para "C: / bin / logs", ele retorna "bin". Use return new DirectoryInfo (fullPath) .Name; em vez de.
28718 Chris W
36

Tente o seguinte:

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

Simples e limpo. Usa apenas System.IO.FileSystem- funciona como um encanto:

string path = "C:/folder1/folder2/file.txt";
string folder = new DirectoryInfo(path).Name;
susieloo_
fonte
3
pasta, neste caso, seria file.txt, e nãofolder2
TJ Rockefeller
13

DirectoryInfo executa o trabalho para remover o nome do diretório

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

Usei esse trecho de código para obter o diretório para um caminho quando nenhum nome de arquivo está no caminho:

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

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

Resultado:

visual

Mario
fonte
Você pode simplesmente fazer Path.GetFileName (dir) e ele retornará o nome da pasta.
jrich523
3
var fullPath = @"C:\folder1\folder2\file.txt";
var lastDirectory = Path.GetDirectoryName(fullPath).Split('\\').LastOrDefault();
Shawn
fonte
2

Também é importante observar que, ao obter uma lista de nomes de diretório em um loop, a DirectoryInfoclasse é inicializada uma vez, permitindo apenas a primeira chamada. Para contornar essa limitação, certifique-se de usar variáveis ​​dentro do seu loop para armazenar o nome de qualquer diretório individual.

Por exemplo, esse código de amostra percorre uma lista de diretórios em qualquer diretório pai enquanto adiciona cada nome de diretório encontrado dentro de uma lista de tipos de sequência:

[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
fonte
1

O código abaixo ajuda a obter apenas o nome da pasta

 itens públicos ObservableCollection = new ObservableCollection ();

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

                }

            }
            catch (exceção a)
            {

            }
  public class gridItems
    {
        string pública nome da pasta {get; conjunto; }
        caminho da pasta da cadeia pública {get; conjunto; }
    }
Joee
fonte
0

Isso é feio, mas evita alocações:

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
fonte