Exercício – Ler e escrever em ficheiros

Concluído

Também pode utilizar a classe File no .NET para escrever dados em ficheiros e ler dados de ficheiros.

Está quase a terminar a criação de uma obra-prima do .NET para a Tailwind Traders. Até agora, o seu código lê qualquer diretório, encontra todos os ficheiros .json e cria um ficheiro totals.txt.

Neste exercício, você conclui o projeto lendo os arquivos .json, somando os totais de armazenamento e gravando o total geral no arquivo totals.txt .

Adicionar System.Text.Json ao projeto

  1. Com o terminal, adicione Json.NET ao projeto.

    dotnet add package System.Text.Json
    

Preparar para dados de vendas

  1. Na parte superior do Program.cs, adicione using Newtonsoft.Json:

    using System.Text.Json;
    
  2. Diretamente Program.cs sob o FindFiles método, adicione um novo record que modele os dados sales.json :

    record SalesData (double Total);
    

Crie um método para calcular o total de vendas

  1. No Program.cs, imediatamente antes da record linha adicionada na etapa anterior, crie uma nova função que calcule o total de vendas. Este método deverá utilizar um IEnumerable<string> de caminhos de ficheiro sobre o qual pode iterar.

    double CalculateSalesTotal(IEnumerable<string> salesFiles)
    {
        double salesTotal = 0;
    
        // READ FILES LOOP
    
        return salesTotal;
    }
    
  2. Dentro desse método, substitua // READ FILES LOOP por um loop que itera sobre o salesFiles, lê o arquivo, analisa o conteúdo como JSON e, em seguida, incrementa a salesTotal variável com o total valor do arquivo:

    double CalculateSalesTotal(IEnumerable<string> salesFiles)
    {
        double salesTotal = 0;
    
        // Loop over each file path in salesFiles
        foreach (var file in salesFiles)
        {      
            // Read the contents of the file
            string salesJson = File.ReadAllText(file);
    
            // Parse the contents as JSON
            SalesData? data = JsonSerializer.Deserialize<SalesData?>(salesJson);
    
            // Add the amount found in the Total field to the salesTotal variable
            salesTotal += data?.Total ?? 0;
        }
    
        return salesTotal;
    }
    

Chamar o método CalculateSalesTotals

  1. Program.cs No arquivo, adicione uma chamada para a CalculateSalesTotal função logo acima da File.WriteAllText chamada:

    var currentDirectory = Directory.GetCurrentDirectory();
    var storesDir = Path.Combine(currentDirectory, "stores");
    
    var salesTotalDir = Path.Combine(currentDirectory, "salesTotalDir");
    Directory.CreateDirectory(salesTotalDir);
    
    var salesFiles = FindFiles(storesDir);
    
    var salesTotal = CalculateSalesTotal(salesFiles); // Add this line of code
    
    File.WriteAllText(Path.Combine(salesTotalDir, "totals.txt"), String.Empty);
    

Escreva o total no ficheiro totals.txt

  1. Program.cs No arquivo, modifique o File.WriteAllText bloco para gravar o salesTotal valor da variável no arquivo totals.txt. Enquanto você estiver nele, altere a File.WriteAllText chamada para File.AppendAllText para que nada no arquivo seja substituído.

    var currentDirectory = Directory.GetCurrentDirectory();            
    var storesDir = Path.Combine(currentDirectory, "stores");
    
    var salesTotalDir = Path.Combine(currentDirectory, "salesTotalDir");
    Directory.CreateDirectory(salesTotalDir);            
    
    var salesFiles = FindFiles(storesDir);
    
    var salesTotal = CalculateSalesTotal(salesFiles);
    
    File.AppendAllText(Path.Combine(salesTotalDir, "totals.txt"), $"{salesTotal}{Environment.NewLine}");
    
  2. Pressione Ctrl+S / Cmd+S para salvar o arquivo Program.cs.

Execute o programa

  1. Execute o programa a partir do terminal:

    dotnet run
    

    Não existe saída do programa. Se você olhar no arquivo salesTotalDir/totals.txt , encontrará o total de todas as vendas do arquivo sales.json .

  2. Execute novamente o programa a partir do terminal.

    dotnet run
    
  3. Selecione o arquivo salesTotalDir/totals.txt .

    O ficheiro totals.txt tem agora uma segunda linha. Sempre que executar o programa, os totais serão novamente adicionados e será escrita uma nova linha no ficheiro.

Excelente trabalho! Escreveu uma ferramenta inteligente, robusta e útil que a Tailwind Traders pode utilizar para processar todas as vendas das respetivas lojas, todas as noites. Na próxima unidade, vamos rever o que aprendeu e algumas sugestões a reter.

Está com dificuldades?

Se você ficou preso durante este exercício, aqui está o código completo para este projeto:

using Newtonsoft.Json; 

var currentDirectory = Directory.GetCurrentDirectory();
var storesDirectory = Path.Combine(currentDirectory, "stores");

var salesTotalDir = Path.Combine(currentDirectory, "salesTotalDir");
Directory.CreateDirectory(salesTotalDir);   

var salesFiles = FindFiles(storesDirectory);

var salesTotal = CalculateSalesTotal(salesFiles);

File.AppendAllText(Path.Combine(salesTotalDir, "totals.txt"), $"{salesTotal}{Environment.NewLine}");

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

double CalculateSalesTotal(IEnumerable<string> salesFiles)
{
    double salesTotal = 0;
    
    // Loop over each file path in salesFiles
    foreach (var file in salesFiles)
    {      
        // Read the contents of the file
        string salesJson = File.ReadAllText(file);
    
        // Parse the contents as JSON
        SalesData? data = JsonConvert.DeserializeObject<SalesData?>(salesJson);
    
        // Add the amount found in the Total field to the salesTotal variable
        salesTotal += data?.Total ?? 0;
    }
    
    return salesTotal;
}

record SalesData (double Total);