Trabalhar com caminhos de arquivo no .NET
O .NET tem um mecanismo interno para trabalhar com caminhos do sistema de arquivos.
No exercício anterior, não havia muitas pastas para analisar. Caso tenha um sistema de arquivos com vários arquivos e pastas, criar caminhos de modo manual pode ser entediante. A boa notícia é que o .NET fornece algumas constantes internas e funções de utilitário para facilitar a identificação de caminhos de arquivo.
Aprenda aqui sobre algumas das constantes e funções de utilitário no namespace System.IO
e do tipo System.Environment
para você tornar o seu programa mais inteligente e resiliente.
Determinar o diretório atual
Às vezes, você não sabe o diretório nem o caminho no qual o programa deve ser executado. Digamos que você queira que o programa use o diretório atual, mas não sabe o caminho.
O .NET expõe o caminho completo do diretório atual por meio do método Directory.GetCurrentDirectory
.
Console.WriteLine(Directory.GetCurrentDirectory());
Caso execute o código anterior a partir da pasta 201 na seguinte estrutura, Directory.GetCurrentDirectory()
retornará stores\201
:
📂 stores
📂 201
Trabalhar com diretórios especiais
O .NET funciona em todos os lugares: no Windows, no macOS, no Linux e, até mesmo, em sistemas operacionais móveis, como o iOS e o Android. Cada sistema operacional pode ou não ter o conceito de pastas especiais do sistema (como um diretório base, que é dedicado a arquivos específicos do usuário ou um diretório da área de trabalho ou um diretório para armazenar arquivos temporários).
Esses tipos de diretórios especiais variam conforme cada sistema operacional. É complicado saber a estrutura do diretório de cada sistema operacional e executar alternâncias de acordo com o SO atual.
A enumeração System.Environment.SpecialFolder
especifica constantes para recuperar caminhos para pastas especiais do sistema.
O código a seguir retorna o caminho para o equivalente à pasta Meus Documentos do Windows ou ao diretório BASE do usuário em todos os outros sistemas operacionais, mesmo que o código esteja sendo executado no Linux:
string docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
Trabalhar com caminhos
Os caminhos são um tema tão frequente que o .NET tem uma classe chamada Path
. Ela é usada de modo específico para trabalhar com eles.
A classe Path
está localizada no namespace System.IO
do .NET e não precisa ser instalada.
Caracteres especiais do caminho
Sistemas operacionais diferentes usam caracteres diferentes para separar níveis de diretório.
Por exemplo, o Windows usa a barra invertida (stores\201
), e o macOS usa a barra "/" (stores/201
).
Para ajudar a usar o caractere correto, a classe Path
contém o campo DirectorySeparatorChar
.
O .NET interpreta de modo automático esse campo no caractere separador aplicável ao sistema operacional quando é preciso criar um caminho manualmente.
Console.WriteLine($"stores{Path.DirectorySeparatorChar}201");
// returns:
// stores\201 on Windows
//
// stores/201 on macOS
Caminhos de junção
A classe Path
funciona com o conceito de caminhos de arquivos e pastas, que são apenas cadeias de caracteres. É possível usar a classe Path
para criar de modo automático caminhos adequados para sistemas operacionais específicos.
Por exemplo, se você quisesse obter o caminho para a pasta repositórios/201, poderia usar a função Path.Combine
para fazer isso.
Console.WriteLine(Path.Combine("stores","201")); // outputs: stores/201
Lembre-se, você deve usar a classe Path.Combine
ou Path.DirectorySeparatorChar
em vez de cadeias de caracteres hard-coding porque o programa pode estar em execução em vários sistemas operacionais diferentes. A classe Path
sempre formata os caminhos corretamente para o sistema operacional na qual esta em execução.
Dica
A classe Path
não se importa se as coisas realmente existem. Os caminhos são conceituais, não físicos. Além disso, a classe cria e analisa cadeias de caracteres para você.
Determinar as extensões de nome de arquivo
A classe Path
também pode informar a extensão de um nome de arquivo. Caso tenha um arquivo e queira saber se ele é um arquivo JSON, é possível usar a função Path.GetExtension
.
Console.WriteLine(Path.GetExtension("sales.json")); // outputs: .json
Tudo que você precisa saber sobre um arquivo ou caminho
A classe Path
contém muitos métodos diferentes que fazem várias coisas. Você pode obter a maioria das informações sobre um diretório ou arquivo usando as classes DirectoryInfo
ou FileInfo
, respectivamente.
string fileName = $"stores{Path.DirectorySeparatorChar}201{Path.DirectorySeparatorChar}sales{Path.DirectorySeparatorChar}sales.json";
FileInfo info = new FileInfo(fileName);
Console.WriteLine($"Full Name: {info.FullName}{Environment.NewLine}Directory: {info.Directory}{Environment.NewLine}Extension: {info.Extension}{Environment.NewLine}Create Date: {info.CreationTime}"); // And many more
Há muitos outros métodos utilitários e propriedades úteis nas classes Path
, DirectoryInfo
e FileInfo
, mas é provável que você use os principais conceitos com mais frequência. No próximo exercício, você comporá caminhos e identificará arquivos .json.