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, seu código lê qualquer diretório, encontra todos os arquivos .json e cria um arquivo 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 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 do
Program.cs, adicioneusing Newtonsoft.Json:using Newtonsoft.Json;Diretamente
Program.cspor baixo doFindFilesmétodo, adicione um novorecordque modele os dados de sales.json :record SalesData (double Total);
Criar um método que calcula totais de vendas
No
Program.cs, imediatamente antes darecordlinha 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 LOOPpor um loop que itera sobre osalesFiles, lê o arquivo, analisa o conteúdo como JSON e, em seguida, incrementa asalesTotalvariável com ototalvalor 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
Program.csNo arquivo, adicione uma chamada para aCalculateSalesTotalfunção logo acima daFile.WriteAllTextchamada: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
No arquivo
Program.cs, modifique o blocoFile.WriteAllTextpara escrever o valor da variávelsalesTotalpara o arquivo totals.txt. Enquanto você estiver nele, altere aFile.WriteAllTextchamada paraFile.AppendAllTextpara 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.
Execute o programa
Execute o programa a partir do terminal:
dotnet runNã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 runSelecione o arquivo salesTotalDir/totals.txt .
O arquivo totals.txt agora tem uma segunda linha. Sempre que executar o programa, os totais serão novamente adicionados e será escrita uma nova linha no ficheiro.
Excelente trabalho! Você escreveu uma ferramenta inteligente, robusta e prática que a Tailwind Traders pode usar para processar todas as vendas de suas 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);