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 6.0. Verifique se tem o .NET 6.0 instalado, executando o seguinte comando em seu terminal preferido:

dotnet --list-sdks

Saída semelhante à seguinte exibida:

3.1.100 [C:\program files\dotnet\sdk]
5.0.100 [C:\program files\dotnet\sdk]
6.0.100 [C:\program files\dotnet\sdk]

Verifique se uma versão que começa com 6 está listada. Se nenhum estiver listado ou o comando não for encontrado, instale o SDK do .NET 6.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 net6.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.

    Screenshot showing the Visual Studio prompt that lets the user know something is missing from the project.

    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.

    Screenshot of EXPLORER window that shows the project folder structure.

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.

    Screenshot of the Explorer window highlighting the program.cs file.

  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 net6.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;
}