Exercício – trabalhar com caminhos

Concluído

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ê gravou um programa que itera para localizar um dos arquivos sales.json por meio de uma pasta ou subpastas.

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.

Usar o diretório atual e combinar 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.

  1. 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étodo Directory.GetCurrentDirectory para obter o caminho para o diretório atual e armazená-lo em uma nova variável currentDirectory:

    var currentDirectory = Directory.GetCurrentDirectory();
    
  2. Insira o código a seguir após a linha que você acabou de adicionar. Esse código usa o método Path.Combine para criar o caminho completo para o diretório lojas e o armazena em uma nova variável storesDirectory:

    var storesDirectory = Path.Combine(currentDirectory, "stores");
    
  3. Substitua a cadeia de caracteres stores na chamada de função FindFiles pela nova variável storesDirectory:

    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);
    }
    
  4. Pressione Ctrl+S (ou Cmd+S macOS) para salvar o arquivo.

  5. Execute o programa na linha de comando:

    dotnet run
    
  6. O 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.json  
    

    Observe que os nomes dos arquivos retornados incluem o caminho completo do sistema. Esse caminho foi incluído porque o método Directory.GetCurrentDirectory retorna 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.

  1. No loop foreach que itera por meio de foundFiles, insira a linha de código a seguir na parte de cima da instrução if para definir uma nova variável extension. Esse código usa o método Path.GetExtension para obter a extensão de cada arquivo.

        var extension = Path.GetExtension(file);
    
  2. Altere a instrução if para ser semelhante à linha de código a seguir. Essa instrução verifica se a extensão do arquivo é .json.

           if (extension == ".json")
    

    O loop foreach será semelhante ao código a seguir:

    foreach (var file in foundFiles)
    {
        var extension = Path.GetExtension(file);
        if (extension == ".json")
        {
            salesFiles.Add(file);
        }
    }
    
  3. Pressione Ctrl+S / Cmd+S para salvar o arquivo.

  4. Execute o programa na linha de comando:

    dotnet run
    

    A saída agora mostra todos os arquivos .json em cada um dos diretórios da ID da 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ê ficou preso em algum ponto deste exercício, veja o código concluído. 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;
}