Como obtenho o diretório a partir do caminho completo de um arquivo?

527

Qual é a maneira mais simples de obter o diretório em que um arquivo está? Estou usando isso para definir um diretório de trabalho.

string filename = @"C:\MyDirectory\MyFile.bat";

Neste exemplo, eu deveria obter "C: \ MyDirectory".

Even Mien
fonte
3
Isso não deveria ser uma string literal? @"C:\MyDirectory\MyFile.bat"
Edgar
3
Alguém quer proteger esta pergunta que tem o direito de fazê-lo? 11 respostas semelhantes com o último a partir de 2017 ..
Boern

Respostas:

838

Se você definitivamente tem um caminho absoluto, use Path.GetDirectoryName(path).

Se você pode obter apenas um nome relativo, use new FileInfo(path).Directory.FullName.

Observe que Pathe FileInfosão encontrados no espaço para nome System.IO.

Jon Skeet
fonte
1
De fato, mas existe um método chamado GetDirectory? Não é GetDirectoryName?
Brandon
1
Você pode apenas usar o DirectoryName em vez do Directory.FullPath, não pode?
Steven Robbins
1
Eu estava à prova de receber um nome relativo. Eu não tinha percebido que o caminho seria absoluto. Eu agora tenho duas versões :)
Jon Skeet
Você usa o snippy para verificar isso? ;)
shahkalpesh 23/03/09
1
@UlyssesAlves: Eu acredito que new FileInfo(path).Directory.FullNamedeve funcionar em ambos os casos.
Jon Skeet
60
System.IO.Path.GetDirectoryName(filename)
Cherian
fonte
22
Path.GetDirectoryName(filename);
Grzenio
fonte
12

Você pode usar System.IO.Path.GetDirectory(filename)ou transformar o caminho em ae FileInfousar FileInfo.Directory.

Se você estiver fazendo outras coisas com o caminho, FileInfopode haver vantagens.

Reed Copsey
fonte
1
não existe um método 'GetDirectory na classe Path; você deve ter significado 'GetDirectoryName
BillW
12

Use o código abaixo mencionado para obter o caminho da pasta

Path.GetDirectoryName(filename);

Isso retornará "C: \ MyDirectory" no seu caso

thejustv
fonte
10

Você pode usar Path.GetDirectoryNamee apenas passar o nome do arquivo.

Link MSDN

Brandon
fonte
5

Se você estiver trabalhando com um FileInfoobjeto, existe uma maneira fácil de extrair uma stringrepresentação do caminho completo do diretório por meio da DirectoryNamepropriedade

Descrição da FileInfo.DirectoryNamepropriedade via MSDN:

Obtém uma string representando o caminho completo do diretório.

Uso da amostra:

string filename = @"C:\MyDirectory\MyFile.bat";
FileInfo fileInfo = new FileInfo(filename);
string directoryFullPath = fileInfo.DirectoryName; // contains "C:\MyDirectory"

Link para a documentação do MSDN .

Derek W
fonte
5

Você pode obter o caminho do aplicativo atual usando:

string AssemblyPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location).ToString();

Boa sorte!

David Castro
fonte
0

Primeiro, você precisa usar o espaço para nome System.IO. Então;

string filename = @"C:\MyDirectory\MyFile.bat";
string newPath = Path.GetFullPath(fileName);

ou

string newPath = Path.GetFullPath(openFileDialog1.FileName));
Umut D.
fonte
0

Você pode usar Path.GetFullPathna maioria dos casos. Mas se você deseja obter o caminho também no caso de o nome do arquivo estar relativamente localizado, use o método genérico abaixo:

string GetPath(string filePath)
{
  return Path.GetDirectoryName(Path.GetFullPath(filePath))
}

Por exemplo:

GetPath("C:\Temp\Filename.txt") Retorna "C:\Temp\"

GetPath("Filename.txt")volte current working directorycomo"C:\Temp\"

Minh Nguyen
fonte
0

No meu caso, eu precisava encontrar o nome do diretório de um caminho completo (de um diretório), então simplesmente:

var dirName = path.Split('\\').Last();
Amir Sem Família
fonte
1
O OP precisa "C:\MyDirectory"e não MyDirectory. O conselho para usar métodos de manipulação de string é arriscado, existem muitas armadilhas, em vez disso, use Pathmétodos dedicados .
Sinatr
-1

Path.GetDirectoryName (Context.Parameters ["assemblypath"])

Ami Vaknin
fonte
Path.GetDirectoryNameé mencionado em muitas outras respostas (incluindo resposta aceita)
barbsan
ahha? Assim?? há algum ponto vindo?
Ami Vaknin