Exercício – Ler e escrever em ficheiros
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
Com o terminal, adicione Json.NET ao projeto.
dotnet add package System.Text.Json
Preparar para dados de vendas
Na parte superior do
Program.cs
, adicioneusing Newtonsoft.Json
:using System.Text.Json;
Diretamente
Program.cs
sob oFindFiles
método, adicione um novorecord
que modele os dados sales.json :record SalesData (double Total);
Crie um método para calcular o total de vendas
No
Program.cs
, imediatamente antes darecord
linha adicionada na etapa anterior, crie uma nova função que calcule o total de vendas. Este método deverá utilizar umIEnumerable<string>
de caminhos de ficheiro sobre o qual pode iterar.double CalculateSalesTotal(IEnumerable<string> salesFiles) { double salesTotal = 0; // READ FILES LOOP return salesTotal; }
Dentro desse método, substitua
// READ FILES LOOP
por um loop que itera sobre osalesFiles
, lê o arquivo, analisa o conteúdo como JSON e, em seguida, incrementa asalesTotal
variável com ototal
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
Program.cs
No arquivo, adicione uma chamada para aCalculateSalesTotal
função logo acima daFile.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
Program.cs
No arquivo, modifique oFile.WriteAllText
bloco para gravar osalesTotal
valor da variável no arquivo totals.txt. Enquanto você estiver nele, altere aFile.WriteAllText
chamada 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.
Execute o programa
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 .
Execute novamente o programa a partir do terminal.
dotnet run
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);