Übung: Lese- und Schreibvorgänge für Dateien

Abgeschlossen

Sie können auch die File-Klasse in .NET verwenden, um Daten in Dateien zu schreiben oder aus diesen zu lesen.

Die Erstellung des .NET-Projekts für Tailwind Traders ist beinahe abgeschlossen. Nach jetzigem Stand liest Ihr Code ein gegebenes Verzeichnis, sucht nach allen Dateien mit der JSON-Erweiterung und erstellt die Datei totals.txt.

In dieser Übung schließen Sie das Projekt ab, indem Sie die JSON-Dateien lesen, den Gesamtumsatz der einzelnen Filialen addieren und das Gesamtergebnis in die Datei totals.txt schreiben.

Hinzufügen von System.Text.Json zum Projekt

  1. Fügen Sie über das Terminal Json.NET zum Projekt hinzu.

    dotnet add package System.Text.Json
    

Vorbereiten auf Verkaufsdaten

  1. Fügen Sie using Newtonsoft.Json oben in Program.cs hinzu:

    using System.Text.Json;
    
  2. Fügen Sie in Program.cs direkt unter der FindFiles-Methode ein neues record-Element hinzu, das die Daten in sales.json modelliert:

    record SalesData (double Total);
    

Erstellen einer Methode zum Berechnen der Gesamtumsätze

  1. Erstellen Sie in Program.cs, direkt vor der Zeile record, die Sie im vorherigen Schritt hinzugefügt haben, eine neue Funktion, die die Umsatzsumme berechnet. Bei dieser Methode sollte ein IEnumerable<string>-Element von Dateipfaden verwendet werden, über die sie iterieren kann.

    double CalculateSalesTotal(IEnumerable<string> salesFiles)
    {
        double salesTotal = 0;
    
        // READ FILES LOOP
    
        return salesTotal;
    }
    
  2. Ersetzen Sie innerhalb dieser Methode // READ FILES LOOP durch eine Schleife, die salesFiles durchläuft, die Datei liest, den Inhalt in das JSON-Format bringt und die Variable salesTotal dann mit dem total-Wert aus der Datei inkrementiert:

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

Aufrufen der CalculateSalesTotals-Methode

  1. Fügen Sie in der Datei Program.cs direkt über dem File.WriteAllText-Aufruf einen Aufruf für die CalculateSalesTotal-Funktion hinzu:

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

Schreiben des Gesamtergebnisses in die Datei „totals.txt“

  1. Ändern Sie in der Datei Program.cs den File.WriteAllText-Block so, dass der Wert der salesTotal-Variablen in die Datei totals.txt geschrieben wird. Wenn Sie schon dabei sind, ändern Sie den File.WriteAllText-Aufruf in File.AppendAllText, damit nichts in der Datei überschrieben wird.

    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. Drücken Sie STRG+S / Befehlstaste+S, um die Datei Program.cs zu speichern.

Ausführen des Programms

  1. Führen Sie das Programm über das Terminal aus:

    dotnet run
    

    Das Programm erzeugt keine Ausgabe. Wenn Sie sich die Datei salesTotalDir/totals.txt ansehen, finden Sie dort die Gesamtsumme der Umsätze aus der Datei sales.json.

  2. Führen Sie das Programm über das Terminal noch mal aus.

    dotnet run
    
  3. Wählen Sie die Datei salesTotalDir/totals.txt aus.

    Die Datei totals.txt enthält jetzt eine zweite Zeile. Bei jeder erneuten Ausführung des Programms werden nun die Gesamtsummen addiert, und es wird eine neue Zeile in die Datei geschrieben.

Ausgezeichnet! Sie haben ein kleines, stabiles und hilfreiches Tool geschrieben, das Tailwind Traders verwenden kann, um jede Nacht die Umsätze aller Filialen des Unternehmens zu verarbeiten. In der nächsten Einheit rekapitulieren Sie das Gelernte und erhalten einige Tipps.

Wissen Sie nicht weiter?

Wenn Sie während dieser Übung Probleme haben, finden Sie hier den vollständigen Projektcode:

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