Exercício – trabalhar com o sistema de arquivos

Concluído

Você pode usar o .NET para localizar e retornar informações sobre arquivos e pastas.

A Tailwind Traders tem muitas lojas físicas em todo o mundo. Todas as noites, cada loja cria um arquivo chamado sales.json que contém o total de todas as vendas efetuadas nesse dia. Esses arquivos são organizados em pastas nomeadas com a ID da loja.

Observação

Este módulo usa a CLI (interface de linha de comando) do .NET e o Visual Studio Code para desenvolvimento local. Após concluir este módulo, você poderá aplicar os conceitos aprendidos usando um ambiente de desenvolvimento, como o Visual Studio (Windows) ou o Visual Studio para Mac (macOS) ou continuar o desenvolvimento no Visual Studio Code (Windows, Linux e macOS).

Este módulo usa o SDK do .NET 8.0. Verifique se você tem o .NET 8.0 instalado executando o seguinte comando em seu terminal de comando preferencial:

dotnet --list-sdks

Uma saída semelhante ao seguinte exemplo aparece:

6.0.317 [C:\Program Files\dotnet\sdk]
7.0.401 [C:\Program Files\dotnet\sdk]
8.0.100 [C:\Program Files\dotnet\sdk]

Verifique se uma versão que começa com 8 está listada. Se nenhum estiver listado ou o comando não for encontrado, instale o SDK do .NET 8.0 mais recente.

Clonar o projeto

Nesse exercício, você vai escrever um programa do .NET que pesquisa arquivos chamados sales.json em um diretório e nos respectivos subdiretórios.

Um projeto inicial já foi criado para você. Você irá cloná-lo usando um terminal integrado no Visual Studio Code.

  1. Abra o Visual Studio Code.

  2. No menu principal, clique em Exibir>Terminal para abrir uma janela do terminal.

  3. Na janela do terminal, altere para um diretório para o qual você deseja copiar os arquivos, como c:\MyProjects (opcional).

  4. Na janela do terminal, execute o seguinte comando para clonar o projeto inicial e acessar o projeto clonado:

    git clone https://github.com/MicrosoftDocs/mslearn-dotnet-files && cd mslearn-dotnet-files
    
  5. Execute o seguinte comando para criar um projeto de console do .NET:

    dotnet new console -f net8.0 -n mslearn-dotnet-files -o .
    
  6. Execute o seguinte comando para abrir o novo projeto .NET na mesma instância do Visual Studio Code:

    code -a .
    

    Dica

    Neste momento, o Visual Studio Code poderá exibir uma mensagem informando que os ativos necessários para criar e executar o projeto estão ausentes.

    Captura de tela mostrando o prompt do Visual Studio que permite que o usuário saiba que algo está faltando no projeto.

    Clique no triângulo com um ponto de exclamação, depois em Reiniciar terminal para adicionar os arquivos que o Visual Studio Code usa para executar e depurar o projeto.

  7. Na janela do Explorer, em mslearn-dotnet-files, expanda a pasta lojas e todas as pastas numeradas dentro dela.

    Uma captura de tela da janela do Explorer mostrando a estrutura de pastas do projeto.

Localizar os arquivos sales.json

As tarefas a seguir criam um programa para localizar todos os arquivos sales.json em todas as pastas do projeto mslearn-dotnet-files.

Incluir o namespace System.IO

  1. Na janela do Explorer, selecione o arquivo Program.cs para abri-lo no editor.

    Uma captura de tela da janela do Explorer realçando o arquivo program.cs.

  2. Cole o seguinte código na primeira linha do arquivo Program.cs para importar os namespaces System.IO e System.Collections.Generic:

    using System.IO;
    using System.Collections.Generic;
    

Observação

Do .NET 6 em diante, as duas instruções do código acima são incluídas automaticamente em um novo projeto por meio do grupo de propriedades ImplcitUsings. Como especificamos o sinalizador -f net8.0 quando criamos um projeto de console, elas são adicionadas implicitamente. No entanto, se você estiver trabalhando com um projeto mais antigo, ele precisará ser incluído no arquivo Program.cs e não afetará o projeto se for deixado no arquivo.

Escrever uma função para localizar os arquivos sales.json

Crie uma função chamada FindFiles que usa um parâmetro folderName.

  1. Substitua a linha Console.WriteLine("Hello, World!"); pelo seguinte código:

    IEnumerable<string> FindFiles(string folderName)
    {
        List<string> salesFiles = new List<string>();
    
        var foundFiles = Directory.EnumerateFiles(folderName, "*", SearchOption.AllDirectories);
    
        foreach (var file in foundFiles)
        {
            // The file name will contain the full path, so only check the end of it
            if (file.EndsWith("sales.json"))
            {
                salesFiles.Add(file);
            }
        }
    
        return salesFiles;
    }
    
  2. Insira o código a seguir abaixo das instruções using para executar uma chamada à função FindFiles. Esse código passa o nome da pasta lojas como o local para pesquisar arquivos.

    var salesFiles = FindFiles("stores");
    
    foreach (var file in salesFiles)
    {
        Console.WriteLine(file);
    }
    
  3. Pressione Ctrl+S (ou Cmd+S macOS) para salvar o arquivo Program.cs.

Execute o programa

  1. Insira o seguinte comando na janela do terminal para executar o programa:

    dotnet run
    
  2. O programa mostrará a seguinte saída:

    stores/sales.json
    stores/201/sales.json
    stores/202/sales.json
    stores/203/sales.json
    stores/204/sales.json
    

Excelente! Você gravou com êxito um programa de linha de comando que percorre todas as pastas do diretório stores e lista todos os arquivos sales.json encontrados.

Neste exemplo, o caminho para o diretório stores era bastante simples e estava no diretório de trabalho do programa. Na próxima unidade, você vai aprender a criar estruturas complexas que funcionam em sistemas operacionais usando a classe Path.

Ficou preso?

Caso tenha tido problemas ao executar o programa, veja abaixo o código concluído para o arquivo Program.cs. Substitua o conteúdo do arquivo Program.cs por este código:

var salesFiles = FindFiles("stores");
    
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)
    {
        // The file name will contain the full path, so only check the end of it
        if (file.EndsWith("sales.json"))
        {
            salesFiles.Add(file);
        }
    }

    return salesFiles;
}