Trabalhar com caminhos de arquivo no .NET

Concluído

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 acima 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. Um sistema operacional pode ou não ter o conceito de pastas especiais do sistema. Como um diretório de residência dedicado a arquivos específicos do usuário, um diretório de desktop 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 em que esta sendo executada.

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 exibir 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.