Exercício – ler e gravar em arquivos
Você também pode usar a classe File
no .NET para gravar dados em arquivos e ler dados de arquivos.
Você está quase terminando de criar uma obra-prima do .NET para a Tailwind Traders. Até agora, seu código lê qualquer diretório, localiza todos os arquivos .json e cria um arquivo totals.txt.
Neste exercício, você conclui o projeto lendo os arquivos .json, somando os totais da loja e gravando o total geral no arquivo totals.txt.
Adicionar Json.NET ao projeto
Usando o terminal, adicione Json.NET ao projeto.
dotnet add package Newtonsoft.Json
Preparar para dados de vendas
Na parte superior de
Program.cs
, adicioneusing Newtonsoft.Json
:using Newtonsoft.Json;
Em
Program.cs
, diretamente abaixo do métodoFindFiles
, adicione um novorecord
que modela os dados do sales.json:record SalesData (double Total);
Criar um método para calcular os totais de vendas
Em
Program.cs
, pouco antes da linharecord
que você adicionou na etapa anterior, crie uma função que calcula o total de vendas. Esse método deverá captar umIEnumerable<string>
de caminhos de arquivo em que ele pode iterar.double CalculateSalesTotal(IEnumerable<string> salesFiles) { double salesTotal = 0; // READ FILES LOOP return salesTotal; }
Nesse método, substitua
// READ FILES LOOP
por um loop que itera emsalesFiles
, lê o arquivo, analisa o conteúdo como JSON e incrementa a variávelsalesTotal
com o valortotal
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 = JsonConvert.DeserializeObject<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
No arquivo
Program.cs
, adicione uma chamada à funçãoCalculateSalesTotal
logo acima da chamadaFile.WriteAllText
: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);
Gravar o total no arquivo totals.txt
No arquivo
Program.cs
, modifique o blocoFile.WriteAllText
para gravar o valor da variávelsalesTotal
no arquivo totals.txt. E, enquanto você estiver nele, altere a chamadaFile.WriteAllText
paraFile.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}");
Pressione Ctrl+S / Cmd+S para salvar o arquivo Program.cs.
Executar o programa
Execute o programa do terminal:
dotnet run
Não há saída do programa. Se você examinar o arquivo salesTotalDir/totals.txt, encontrará o total de todas as vendas do arquivo sales.json.
Execute o programa no terminal novamente.
dotnet run
Selecione o arquivo salesTotalDir/totals.txt.
O arquivo totals.txt agora tem uma segunda linha. Toda vez que você executa o programa, os totais são somados novamente e uma nova linha é escrita no arquivo.
Excelente trabalho! Você escreveu uma ferramenta inteligente, robusta e prática que a Tailwind Traders pode usar para processar todas as vendas de lojas todas as noites. Na próxima unidade, vamos examinar o que você aprendeu e dar algumas dicas para se lembrar.
Ficou preso?
Se você ficou preso durante este exercício, este é o código completo deste 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);