Øvelse – Lese og skrive til filer

Fullført

Du kan også bruke File-klassen i .NET til å skrive data til filer og lese data fra filer.

Du er nesten ferdig med å opprette et .NET-mesterverk for Tailwind Traders. Så langt leser koden en hvilken som helst katalog, finner alle .json filer og oppretter en totals.txt fil.

I denne øvelsen fullfører du prosjektet ved å lese .json filer, legge sammen totalsummene for butikken og skrive totalsummen til totals.txt-filen.

Legg til Newtonsoft.Json i prosjektet

  1. Bruk terminalen til å legge newtonsoft.Json til prosjektet.

    dotnet add package Newtonsoft.Json
    

Klargjøre for salgsdata

  1. Legg til Program.csøverst i using Newtonsoft.Json:

    using Newtonsoft.Json;
    
  2. I Program.cs rett under FindFiles metoden legge til en ny record som modellerer de sales.json dataene:

    record SalesData (double Total);
    

Opprett en metode som beregner salgssummer

  1. I Program.cs, like før den record linjen du la til i forrige trinn, oppretter du en ny funksjon som beregner salgssummen. Denne metoden bør ta en IEnumerable<string> med filbaner som den kan gjentakelse over.

    double CalculateSalesTotal(IEnumerable<string> salesFiles)
    {
        double salesTotal = 0;
    
        // READ FILES LOOP
    
        return salesTotal;
    }
    
  2. Innenfor denne metoden erstatter du // READ FILES LOOP med en løkke som gjentas over salesFiles, leser filen, analyserer innholdet som JSON og øker deretter salesTotal variabelen med den total verdien fra 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 = JsonConvert.DeserializeObject<SalesData?>(salesJson);
    
            // Add the amount found in the Total field to the salesTotal variable
            salesTotal += data?.Total ?? 0;
        }
    
        return salesTotal;
    }
    

Kall calculateSalesTotals-metoden

  1. Legg til et kall i Program.cs-funksjonen like over CalculateSalesTotal anropet i File.WriteAllText-filen:

    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);
    

Skriv totalsummen til totals.txt-filen

  1. Endre Program.cs blokk i File.WriteAllText-filen for å skrive verdien til salesTotal variabelen til totals.txt filen. Mens du er i bruk, endrer du File.WriteAllText kall til File.AppendAllText slik at ingenting i filen blir overskrevet.

    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}");
    
  2. Lagre Program.cs filen ved å trykke CTRL+S / Cmd+S.

Kjør programmet

  1. Kjør programmet fra terminalen:

    dotnet run
    

    Det er ingen utdata fra programmet. Hvis du ser i salesTotalDir/totals.txt-filen, finner du summen av alle salgene fra sales.json filen.

  2. Kjør programmet fra terminalen på nytt.

    dotnet run
    
  3. Velg filen salesTotalDir/totals.txt.

    Den totals.txt filen har nå en ny linje. Hver gang du kjører programmet, legges totalsummene opp igjen, og en ny linje skrives til filen.

Fremragende arbeid! Du skrev et smart, robust og praktisk verktøy som Tailwind Traders kan bruke til å behandle alle butikkenes salg hver kveld. I neste enhet skal vi se gjennom det du har lært, og noen tips å huske.

Ble du sittende fast?

Hvis du ble sittende fast under denne øvelsen, kan du se hele koden for dette prosjektet:

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);