Cvičení – čtení souborů a zápis do souborů
Třídu File
v .NET lze použít rovněž k zápisu dat do souborů a ke čtení dat ze souborů.
Svůj mistrovský kousek .NET pro firmu Tailwind Traders už máte skoro hotový. Zatím váš kód přečte jakýkoli zadaný adresář, najde všechny soubory .json a vytvoří soubor totals.txt.
V tomto cvičení dokončíte projekt čtením .json souborů, sečtením celkových součtů úložiště a zápisem celkového součtu do souboru totals.txt .
Přidání souboru System.Text.Json do projektu
Pomocí terminálu přidejte Json.NET do projektu.
dotnet add package System.Text.Json
Příprava na prodejní data
V horní části pole
Program.cs
přidejteusing Newtonsoft.Json
:using System.Text.Json;
Přímo
Program.cs
pod metoduFindFiles
přidejte novýrecord
model, který modeluje sales.json data:record SalesData (double Total);
Vytvoření metody pro výpočet celkových tržeb
Těsně
Program.cs
před řádkemrecord
, který jste přidali v předchozím kroku, vytvořte novou funkci, která vypočítá celkový prodej. Tato metoda by měla převzítIEnumerable<string>
z cest k souborům a projít ho.double CalculateSalesTotal(IEnumerable<string> salesFiles) { double salesTotal = 0; // READ FILES LOOP return salesTotal; }
V rámci této metody nahraďte
// READ FILES LOOP
smyčkou, která iterujesalesFiles
soubor , přečte soubor, parsuje obsah jako JSON a potom zvýšísalesTotal
proměnnou hodnotoutotal
ze souboru: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; }
Volání metody CalculateSalesTotals
Program.cs
Do souboru přidejte voláníCalculateSalesTotal
do funkce těsně nadFile.WriteAllText
volání: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);
Zápis součtu do souboru totals.txt
Program.cs
V souboru upravteFile.WriteAllText
blok tak, aby zapisoval hodnotusalesTotal
proměnné do souboru totals.txt. Když jste na tom, změňteFile.WriteAllText
volání takFile.AppendAllText
, aby se nic v souboru nepřepsal.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}");
Stisknutím kombinace kláves Ctrl+S / Cmd+S uložte Program.cs soubor.
Spuštění programu
Spusťte program z terminálu:
dotnet run
Z programu nevznikne žádný výstup. Pokud se podíváte do souboru salesTotalDir/totals.txt , najdete celkový součet všech prodejů ze souboru sales.json .
Znovu spusťte tento program z terminálu.
dotnet run
Vyberte soubor salesTotalDir/totals.txt.
Soubor total.txt má nyní druhý řádek. Pokaždé, když program spustíte, se součty znovu nasčítají a do souboru se zapíše nový řádek.
Skvělá práce! Napsali jste inteligentní, robustní a užitečný nástroj, který ve firmě Tailwind Traders mohou každou noc použít ke zpracování tržeb ze všech prodejen. V další lekci si probereme, co jste se naučili, a přidáme pár tipů, které byste si měli zapamatovat.
Zasekli jste se?
Pokud jste se během tohoto cvičení zasekli, tady je úplný kód pro tento projekt:
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);