Ćwiczenie — odczytywanie i zapisywanie w plikach

Ukończone

Klasy File na platformie .NET można używać również do zapisywania danych w plikach i odczytywania danych z plików.

Arcydzieło platformy .NET dla firmy Tailwind Traders jest już prawie gotowe. Na razie Twój kod odczytuje dowolny katalog, znajduje wszystkie pliki JSON i tworzy plik totals.txt.

W tym ćwiczeniu ukończysz projekt, odczytując pliki .json, sumując sumy sklepów i zapisując sumę końcową do pliku totals.txt .

Dodawanie pliku System.Text.Json do projektu

  1. Przy użyciu terminalu dodaj bibliotekę Json.NET do projektu.

    dotnet add package System.Text.Json
    

Przygotowanie do danych sprzedaży

  1. W górnej części pliku Program.csdodaj polecenie using Newtonsoft.Json:

    using System.Text.Json;
    
  2. W Program.cs obszarze FindFiles metody dodaj nowąrecord, która modeluje dane sales.json:

    record SalesData (double Total);
    

Tworzenie metody w celu obliczenia sum sprzedaży

  1. W Program.cspliku tuż przed wierszem dodanym record w poprzednim kroku utwórz nową funkcję, która oblicza sumę sprzedaży. Ta metoda powinna przyjmować wartość IEnumerable<string> ścieżek plików, po których może iterować.

    double CalculateSalesTotal(IEnumerable<string> salesFiles)
    {
        double salesTotal = 0;
    
        // READ FILES LOOP
    
        return salesTotal;
    }
    
  2. W ramach tej metody zastąp // READ FILES LOOP pętlą, która iteruje salesFilesplik , odczytuje plik, analizuje zawartość w formacie JSON, a następnie zwiększa salesTotal zmienną o total wartość z pliku:

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

Wywoływanie metody CalculateSalesTotals

  1. Program.cs W pliku dodaj wywołanie funkcji CalculateSalesTotal tuż nad wywołaniemFile.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);
    

Zapisywanie sumy w pliku totals.txt

  1. Program.cs W pliku zmodyfikuj File.WriteAllText blok, aby zapisać wartość salesTotal zmiennej w pliku totals.txt. Gdy jesteś w nim, zmień File.WriteAllText wywołanie na File.AppendAllText , aby nic w pliku nie było zastępowane.

    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. Naciśnij Ctrl+S / Cmd+S, aby zapisać plik Program.cs.

Uruchamianie programu

  1. Uruchom program z poziomu terminalu:

    dotnet run
    

    Program nie wyświetli żadnych danych wyjściowych. Jeśli spojrzysz na plik salesTotalDir/totals.txt , znajdziesz sumę wszystkich sprzedaży z pliku sales.json .

  2. Ponownie uruchom program w terminalu.

    dotnet run
    
  3. Wybierz plik salesTotalDir/totals.txt.

    Plik totals.txt ma teraz drugi wiersz. Za każdym razem, gdy uruchamiasz program, sumy są ponownie dodawane i w pliku jest zapisywany nowy wiersz.

Doskonale! Dzięki Tobie firma Tailwind Traders ma inteligentne, niezawodne i przydatne narzędzie, za pomocą którego co wieczór może przetwarzać sprzedaż ze wszystkich swoich sklepów. W następnej lekcji podsumujemy to, czego się nauczyliśmy, i przedstawimy kilka porad, które warto zapamiętać na przyszłość.

Nie wiesz, co zrobić?

Jeśli podczas tego ćwiczenia utkniesz, oto pełny kod dla tego projektu:

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