Övning – Läsa och skriva till filer
Du kan även använda klassen File
i .NET för att skriva data till filer och läsa data från filer.
Du är nästan klar med .NET-projektet för Tailwind Traders. Hittills kan koden läsa valfri katalog, leta reda på alla .json-filer och skapa en totals.txt-fil.
I den här övningen slutför du projektet genom att läsa .json-filerna, lägga till butikssummorna och skriva totalsumman till totals.txt filen.
Lägg till System.Text.Json i projektet
Lägg till Json.NET till projektet med hjälp av terminalen.
dotnet add package System.Text.Json
Förbereda för försäljningsdata
Lägg till
using Newtonsoft.Json
: överst iProgram.cs
.using System.Text.Json;
I
Program.cs
direkt underFindFiles
metoden lägger du till en nyrecord
som modellerar sales.json data:record SalesData (double Total);
Skapa en metod för att beräkna försäljningssummor
I
Program.cs
, precis före radenrecord
som du lade till i föregående steg, skapar du en ny funktion som beräknar försäljningssumman. Den här metoden ska ta enIEnumerable<string>
med filsökvägar som den kan iterera över.double CalculateSalesTotal(IEnumerable<string> salesFiles) { double salesTotal = 0; // READ FILES LOOP return salesTotal; }
I den metoden ersätter du
// READ FILES LOOP
med en loop som itererar översalesFiles
, läser filen, parsar innehållet som JSON och ökar sedan variabelnsalesTotal
medtotal
värdet från filen: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; }
Anropa metoden CalculateSalesTotals
Program.cs
I filen lägger du till ett anrop tillCalculateSalesTotal
funktionen precis ovanför anropetFile.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);
Skriva summan till filen totals.txt
Program.cs
I filen ändrar duFile.WriteAllText
blocket för att skriva värdet för variabelnsalesTotal
till totals.txt-filen. När du håller på ändrar du anropetFile.WriteAllText
till så attFile.AppendAllText
ingenting i filen skrivs över.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}");
Spara filen Program.cs genom att trycka på Ctrl+S / Cmd+S.
Köra programmet
Kör programmet från terminalen:
dotnet run
Det finns inga utdata från programmet. Om du tittar i filen salesTotalDir/totals.txt hittar du summan av all försäljning från filen sales.json .
Kör programmet från terminalen igen.
dotnet run
Välj filen salesTotalDir/totals.txt.
Filen totals.txt innehåller nu en andra rad. Varje gång du kör programmet adderas summorna igen och en ny rad skrivs till filen.
Fantastiskt jobbat! Med ditt smarta, robusta och praktiska verktyg kan Tailwind Traders bearbeta alla sina butikers försäljning varje natt. I nästa lektion går vi igenom det som du har lärt dig samt några användbara tips.
Har du fastnat?
Om du fastnade under den här övningen är det här den fullständiga koden för det här projektet:
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);