Obter caminho completo sem o nome do arquivo do caminho que inclui o nome do arquivo


198

Existe algo embutido System.IO.Pathque me dê apenas o caminho do arquivo?

Por exemplo, se eu tiver um string

@ "c: \ servidor da web \ público \ minhaempresa \ configs \ promo.xml",

Existe algum método BCL que me dê

"c: \ servidor da web \ público \ minhaempresa \ configs \"?



FWIW: Eu "desisti" da manipulação de "caminhos" pelo Path e usamos nossos próprios métodos com melhores expectativas e uniformidade com o UNC (tente usar GetDirectoryName em um caminho UNC) e convenções (por exemplo, trailing /).
— user2864740

A menos que o arquivo ou diretório exista, não há como saber se promo.xmldesigna um arquivo ou diretório com o mesmo nome. É provavelmente por isso que a Path.GetDirectoryName()implementação é tão simples e apenas trunca o último segmento ou remove a barra final, se houver um.
— Abel

Respostas:


241

Path.GetDirectoryName()... mas você precisa saber que o caminho que está passando para ele contém um nome de arquivo; ele simplesmente remove o bit final do caminho, seja um nome de arquivo ou diretório (na verdade, ele não tem idéia de qual).

Você pode validar primeiro testando File.Exists()e / ou Directory.Exists()em seu caminho primeiro para ver se precisa chamarPath.GetDirectoryName


2
Não há necessidade de ligar File.Exists(). Na verdade, é bastante contraproducente no caso em que o motivo para encontrar o nome do diretório é criá-lo, se ele ainda não existir.
— Jon Hanna

3
Seu exemplo nota explicitamente um caminho com um nome de arquivo. Se esse é o padrão dos caminhos que ele está testando e se esses caminhos representam arquivos existentes, marcar File.Exists () certamente seria útil, você não concorda? Como a situação poderia ser diferente, é claro, eu estava apenas sugerindo que ele 'pudesse' usar os métodos Exists no arquivo e / ou diretório; obviamente, conforme apropriado para sua situação.
— Andrew Barber

Sim, um caminho com um nome de arquivo. Não há nada para indicar que exista um arquivo, pois os nomes dos arquivos são os primeiros.
— Jon Hanna

4
Como eu disse; é uma opção e pode ajudar dependendo do que se sabe sobre o caminho. Ou pode não ser necessário. Mas testar File.Exists () e Directory.Exists () no mesmo caminho é uma maneira rápida e fácil de saber se um caminho que existe é um arquivo ou diretório.
— Andrew Barber

5
como uma referência rápida, em redundância com a pergunta e tratamento "óbvio", você precisa incluir System.IOpara que isso funcione.
— cregox 11/09/12

70
Console.WriteLine(Path.GetDirectoryName(@"C:\hello\my\dear\world.hm")); 

2
Isso é o melhor. Lembre using System.IO;- se de utilizar métodos de caminho
— Erro de sintaxe

Note que isto não inclui uma barra à direita (o trivial para adicionar um)
— Mingwei Samuel

51

Path.GetDirectoryName()retorna o nome do diretório, portanto, o que você deseja (com o caractere solidus reverso à direita) pode chamar Path.GetDirectoryName(filePath) + Path.DirectorySeparatorChar.


12
    string fileAndPath = @"c:\webserver\public\myCompany\configs\promo.xml";

    string currentDirectory = Path.GetDirectoryName(fileAndPath);

    string fullPathOnly = Path.GetFullPath(currentDirectory);

currentDirectory: c: \ servidor da web \ public \ minhaempresa \ configs

fullPathOnly: c: \ servidor da web \ public \ minhaempresa \ configs


6
Forneça algumas informações sobre como o código acima responde à pergunta para melhorar essa resposta.
— Eric Hauenstein

1
Path.GetFullPath retorna o caminho completo sem o nome do arquivo.
— Kobie Williams

mostrar a saída seria útil, não tenho idéia de qual é a diferença entre as duas últimas linhas.
— gakera

saída seria -> c: \ webserver \ public \ myCompany \ configs
— Kobie Williams

5

Use 'GetParent ()' como mostrado, funciona bem. Adicione a verificação de erros conforme necessário.

var fn = openFileDialogSapTable.FileName;
var currentPath = Path.GetFullPath( fn );
currentPath = Directory.GetParent(currentPath).FullName;

4

Eu usei isso e funciona bem:

string[] filePaths = Directory.GetFiles(Path.GetDirectoryName(dialog.FileName));

foreach (string file in filePaths)
{   
    if (comboBox1.SelectedItem.ToString() == "")
    {
        if (file.Contains("c"))
        {
            comboBox2.Items.Add(Path.GetFileName(file));
        }
    }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.