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ê concluirá o projeto lendo os arquivos .json, somando os totais da loja e registrando o total geral no arquivo totals.txt.
Adicionar Newtonsoft.Json ao projeto
Usando o terminal, adicione Newtonsoft.Json 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 novorecordque modela os dados do sales.json:record SalesData (double Total);
Criar um método que calcula totais de vendas
Em
Program.cs, pouco antes da linharecordque 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 LOOPpor um loop que itera emsalesFiles, lê o arquivo, analisa o conteúdo como JSON e incrementa a variávelsalesTotalcom o valortotaldo 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çãoCalculateSalesTotallogo 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.WriteAllTextpara gravar o valor da variávelsalesTotalno arquivo totals.txt. E, enquanto você estiver nele, altere a chamadaFile.WriteAllTextparaFile.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}");Salve o arquivo Program.cs pressionando Ctrl+S / Cmd+S.
Executar o programa
Execute o programa do terminal:
dotnet runNão há saída do programa. Se você procurar no arquivo salesTotalDir/totals.txt , encontrará o total de todas as vendas do arquivo sales.json .
Execute o programa no terminal novamente.
dotnet runSelecione 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);