Övning – Läsa och skriva till filer

Slutförd

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

  1. 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

  1. Lägg till using Newtonsoft.Json: överst i Program.cs.

    using System.Text.Json;
    
  2. I Program.cs direkt under FindFiles metoden lägger du till en ny record som modellerar sales.json data:

    record SalesData (double Total);
    

Skapa en metod för att beräkna försäljningssummor

  1. I Program.cs, precis före raden record 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 en IEnumerable<string> med filsökvägar som den kan iterera över.

    double CalculateSalesTotal(IEnumerable<string> salesFiles)
    {
        double salesTotal = 0;
    
        // READ FILES LOOP
    
        return salesTotal;
    }
    
  2. I den metoden ersätter du // READ FILES LOOP med en loop som itererar över salesFiles, läser filen, parsar innehållet som JSON och ökar sedan variabeln salesTotal med total 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

  1. Program.cs I filen lägger du till ett anrop till CalculateSalesTotal 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

  1. Program.cs I filen ändrar du File.WriteAllText blocket för att skriva värdet för variabeln salesTotal till totals.txt-filen. När du håller på ändrar du anropet File.WriteAllText till så att File.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}");
    
  2. Spara filen Program.cs genom att trycka på Ctrl+S / Cmd+S.

Köra programmet

  1. 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 .

  2. Kör programmet från terminalen igen.

    dotnet run
    
  3. 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);