Exercício – trabalhar com caminhos
A classe Path do .NET e Directory.GetCurrentDirectory são duas maneiras de definir e compor caminhos do sistema de arquivos.
No exercício anterior, você escreveu um programa que itera por uma pasta para encontrar quaisquer arquivos sales.json nela ou em qualquer subpasta.
Neste exercício, utilize a classe Path e Directory.GetCurrentDirectory para aprimorar o programa, de modo que ele localize qualquer arquivo com uma extensão .json.
Use o diretório atual e combine caminhos
No código Program.cs atual, você está passando a localização estática da pasta repositórios. Agora, vamos alterar esse código para usar o valor Directory.GetCurrentDirectory em vez de passar um nome de pasta estática.
No editor, insira o código a seguir na parte de cima da primeira linha do arquivo
Program.cs. Este código usa o métodoDirectory.GetCurrentDirectorypara obter o caminho para o diretório atual e armazená-lo em uma nova variávelcurrentDirectory:var currentDirectory = Directory.GetCurrentDirectory();Insira o código a seguir após a linha que você acabou de adicionar. Esse código usa o método
Path.Combinepara criar o caminho completo para o diretório lojas e o armazena em uma nova variávelstoresDirectory:var storesDirectory = Path.Combine(currentDirectory, "stores");Substitua a cadeia de caracteres
storesna chamada de funçãoFindFilespela nova variávelstoresDirectory:var salesFiles = FindFiles(storesDirectory);O início do arquivo agora será semelhante ao seguinte snippet:
var currentDirectory = Directory.GetCurrentDirectory(); var storesDirectory = Path.Combine(currentDirectory, "stores"); var salesFiles = FindFiles(storesDirectory); foreach (var file in salesFiles) { Console.WriteLine(file); }Pressione Ctrl+S (ou Cmd+S macOS) para salvar o arquivo.
Execute o programa na linha de comando:
dotnet runO programa mostrará a seguinte saída:
/home/username/dotnet-files/stores/sales.json /home/username/dotnet-files/stores/201/sales.json /home/username/dotnet-files/stores/202/sales.json /home/username/dotnet-files/stores/203/sales.json /home/username/dotnet-files/stores/204/sales.jsonObserve que os nomes dos arquivos retornados incluem o caminho completo do sistema. Esse caminho foi incluído porque o método
Directory.GetCurrentDirectoryretorna um caminho completo para o local atual.
Localizar todos os arquivos .json
Em vez de procurar somente arquivos sales.json, o programa precisa pesquisar todos os arquivos com a extensão .json. Para fazer isso, use o método Path.GetExtension a fim de verificar a extensão de cada arquivo.
No loop
foreachque itera por meio defoundFiles, insira a linha de código a seguir na parte de cima da instruçãoifpara definir uma nova variávelextension. Esse código usa o métodoPath.GetExtensionpara obter a extensão de cada arquivo.var extension = Path.GetExtension(file);Altere a instrução
ifpara ser semelhante à linha de código a seguir. Essa instrução verifica se a extensão do arquivo é .json.if (extension == ".json")O loop
foreachserá semelhante ao código a seguir:foreach (var file in foundFiles) { var extension = Path.GetExtension(file); if (extension == ".json") { salesFiles.Add(file); } }Pressione Ctrl+S / Cmd+S para salvar o arquivo.
Execute o programa na linha de comando:
dotnet runA saída agora mostra todos os arquivos .json em cada um dos diretórios de ID de loja:
/home/username/dotnet-files/stores/sales.json /home/username/dotnet-files/stores/201/sales.json /home/username/dotnet-files/stores/201/salestotals.json /home/username/dotnet-files/stores/202/sales.json /home/username/dotnet-files/stores/202/salestotals.json /home/username/dotnet-files/stores/203/sales.json /home/username/dotnet-files/stores/203/salestotals.json /home/username/dotnet-files/stores/204/sales.json /home/username/dotnet-files/stores/204/salestotals.json
Bom trabalho! Você usou a classe Path e o método Directory.GetCurrentDirectory para tornar o programa bem mais robusto. Na próxima unidade, você aprenderá a criar diretórios e a mover arquivos entre locais.
Ficou preso?
Se você encalhar em algum ponto deste exercício, aqui está o código completo. Remova tudo o que há em Program.cs e substitua por essa solução:
var currentDirectory = Directory.GetCurrentDirectory();
var storesDirectory = Path.Combine(currentDirectory, "stores");
var salesFiles = FindFiles(storesDirectory);
foreach (var file in salesFiles)
{
Console.WriteLine(file);
}
IEnumerable<string> FindFiles(string folderName)
{
List<string> salesFiles = new List<string>();
var foundFiles = Directory.EnumerateFiles(folderName, "*", SearchOption.AllDirectories);
foreach (var file in foundFiles)
{
var extension = Path.GetExtension(file);
if (extension == ".json")
{
salesFiles.Add(file);
}
}
return salesFiles;
}