Obtenha o nome da pasta a partir do caminho completo do arquivo

116

Como obtenho o nome da pasta do caminho completo do aplicativo?

Este é o caminho do arquivo abaixo,

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

Aqui, "texto" é o nome da pasta.

Como posso obter o nome dessa pasta a partir deste caminho?

vasmay
fonte

Respostas:

205

Consulte DirectoryInfo.Name :

string dirName = new DirectoryInfo(@"c:\projects\roott\wsdlproj\devlop\beta2\text").Name;
Alex Pacurar
fonte
Isso não exige que a pasta exista realmente no sistema de arquivos (o nome da pasta ainda seria "texto" para esse caminho completo de arquivo se a pasta "c: \ projects \ root \ wsdlproj \ devlop \ beta2 \ text" não ( atualmente) existe no sistema de arquivos)?
Peter Mortensen,
@PeterMortensen, no. Acabei de testar isso e o método retorna o nome da pasta de nível mais baixo da string, mesmo se o caminho da pasta não existir.
vbguyny
1
Obrigado, ótima resposta. Mas estou um pouco confuso que System.IO.Directory não suporte tal operação.
anhoppe
1
@anhoppe - eu concordo. Outra opção que vi é Path.GetDirectoryName msdn.microsoft.com/en-us/library/… - mas não poderei testá-lo até amanhã.
Don Cheadle
30

Acho que você deseja obter o nome da pasta pai do caminho do arquivo. É fácil conseguir. Uma maneira é criar um FileInfoobjeto de tipo e usar sua Directorypropriedade.

Exemplo:

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

String dirName = fInfo.Directory.Name;
Shekhar
fonte
16

Tente isto

var myFolderName = @"c:\projects\roott\wsdlproj\devlop\beta2\text";
var result = Path.GetFileName(myFolderName);
Øyvind Bråthen
fonte
se você tiver um nome de arquivo na string, ele retornará o nome de arquivo também
swissben
1
Nesse caso, o texto é o nome do arquivo (sem extensão). Achei que era isso que o OP queria. Se é uma pasta ou um nome de arquivo, não importa. Se a string não contiver o nome do arquivo, este código lhe dará o que ele procura.
Øyvind Bråthen,
4
A menos que os caminhos terminem com um \ assim:@"c:\projects\roott\wsdlproj\devlop\beta2\text\"
Kristof Claes,
1
isso não funciona para uma pasta. Recebo uma string em branco. Deve haver um arquivo presente
BraveNewMath
3
Isso funciona bem se o caminho da pasta não contiver uma barra invertida (como, por exemplo, um caminho da pasta retornado de Path.GetDirectoryName () ). O nome dessa função, GetFileName (), é um pouco enganador.
Peter Mortensen,
9

Você pode usar isto:

string path = @"c:\projects\roott\wsdlproj\devlop\beta2\text";
string lastDirectory = path.Split(new char[] { System.IO.Path.DirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries).Last();
Kristof Claes
fonte
e se o caminho for assim: @ "c: \ projects \ roott \ wsdlproj \ devlop \ beta2 \ text \", portanto, com um DirectorySeparatorChar extra
Alex Pacurar
1
@Alex - modifiquei meu código para fazê-lo funcionar com esse tipo de caminho também. StringSplitOptions.RemoveEmptyEntriesfaz o truque.
Kristof Claes,
De acordo com msdn.microsoft.com/en-us/library/… , FileInfo pode lançar uma exceção se a permissão necessária não for fornecida.
Daniel B
5

Basta usar Path.GetFileName

Aqui - Extraia o nome da pasta do caminho completo de uma pasta:

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

Aqui estão alguns extras - Extraia o nome da pasta do caminho completo de um arquivo:

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

Percebi que não há outra maneira a não ser acessar o sistema de arquivos para descobrir se text.txt é um diretório ou apenas um arquivo. Se você queria algo simples, talvez você possa apenas usar:

s.Substring(s.LastIndexOf(@"\"));
Zuoanqh
fonte
1
Para evitar uma barra no início da string: s.Substring (s.LastIndexOf (@ "\") + 1);
David Yates
2

Neste caso, o arquivo que você deseja obter é armazenado na variável strpath:

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

Aqui está um método alternativo que funcionou para mim sem precisar criar um objeto DirectoryInfo. O ponto principal é que GetFileName()funciona quando não há nenhuma barra final no caminho.

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

Exemplo:

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

Isso também pode ser feito assim;

var directoryName = System.IO.Path.GetFileName(@"c:\projects\roott\wsdlproj\devlop\beta2\text");
Steve Cooper
fonte
isso retornará uma string vazia
disklosr
@disklosr - acabou de testar com ScriptCs e retorna 'texto'
Steve Cooper
2
Isso funciona bem se o caminho da pasta não contiver uma barra invertida (como, por exemplo, um caminho da pasta retornado de Path.GetDirectoryName () ). O nome dessa função, GetFileName (), é um pouco enganador.
Peter Mortensen,
0

Com base em respostas anteriores (mas corrigidas)

using static System.IO.Path;

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

Explicação dos GetFileNamede fonte .NET :

Retorna o nome e as partes da extensão do caminho fornecido. A string resultante contém os caracteres do caminho que seguem a última barra invertida ("\"), barra ("/") ou dois pontos (":") caractere no caminho. A string resultante é o caminho inteiro se o caminho não contiver barra invertida após a remoção de barras, barra ou caracteres de dois pontos. A string resultante será nula se o caminho for nulo.

Marsze
fonte
-3
Path.GetDirectoryName(@"c:\projects\roott\wsdlproj\devlop\beta2\text");

MSDN: Método Path.GetDirectoryName

suíço
fonte
11
Isso vai voltar c:\projects\roott\wsdlproj\devlop\beta2, e não era isso que o OP buscava.
Øyvind Bråthen