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 \"?

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

Andrew Barber
fonte
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")); 
explorador
fonte
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.

Jon Hanna
fonte
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

Kobie Williams
fonte
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;
kevinwaite
fonte
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));
        }
    }
}
Karam
fonte