Exercice - Lire et écrire dans des fichiers

Effectué

Vous pouvez aussi utiliser la classe File dans .NET pour lire et écrire des données dans des fichiers.

Vous avez presque fini de créer un magnifique programme .NET pour Tailwind Traders. Pour l’instant, votre code lit n’importe quel répertoire, trouve tous les fichiers .json et crée un fichier totals.txt.

Dans cet exercice, vous terminez le projet en lisant les fichiers .json, en ajoutant les totaux du magasin et en écrivant le total général dans le fichier totals.txt.

Ajouter System.Text.Json au projet

  1. À l’aide du terminal, ajoutez Json.NET au projet.

    dotnet add package System.Text.Json
    

Préparer les données de vente

  1. En haut de Program.cs, ajoutez using Newtonsoft.Json :

    using Newtonsoft.Json;
    
  2. Dans Program.cs, directement sous la méthode FindFiles, ajoutez un nouveau record qui modélise les données de sales.json :

    record SalesData (double Total);
    

Créer une méthode qui calcule les totaux des ventes

  1. Dans Program.cs, juste avant la ligne record que vous avez ajoutée à l’étape précédente, créez une fonction qui calcule le total des ventes. Cette méthode doit prendre un IEnumerable<string> de chemins de fichiers dans lequel elle peut itérer.

    double CalculateSalesTotal(IEnumerable<string> salesFiles)
    {
        double salesTotal = 0;
    
        // READ FILES LOOP
    
        return salesTotal;
    }
    
  2. Dans cette méthode, remplacez // READ FILES LOOP par une boucle qui itère dans le salesFiles, lit le fichier, analyse le contenu au format JSON, puis incrémente la variable salesTotal avec la valeur total du fichier :

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

Appeler la méthode CalculateSalesTotals

  1. Dans le fichier Program.cs, ajoutez un appel à la fonction CalculateSalesTotal juste au-dessus de l’appel de File.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);
    

Écrire le total dans le fichier totals.txt

  1. Dans le fichier Program.cs, modifiez le bloc File.WriteAllText pour écrire la valeur de la variable salesTotal dans le fichier totals.txt. Pendant que vous y êtes, modifiez l’appel File.WriteAllText de File.AppendAllText pour que rien dans le fichier ne soit écrasé.

    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. Enregistrez le fichier Program.cs en appuyant sur Ctrl+S / Cmd+S.

Exécuter le programme

  1. Exécutez le programme à partir du terminal :

    dotnet run
    

    Il n’y a aucune sortie provenant du programme. Si vous examinez le fichier salesTotalDir/totals.txt, vous voyez le total de toutes les ventes du fichier sales.json.

  2. Réexécutez le programme à partir du terminal.

    dotnet run
    
  3. Sélectionnez le fichier salesTotalDir/totals.txt.

    Le fichier totals.txt contient maintenant une deuxième ligne. Chaque fois que vous exécutez le programme, les totaux sont à nouveau ajoutés et une nouvelle ligne est écrite dans le fichier.

Beau travail ! Vous avez écrit un outil intelligent, robuste et pratique que Tailwind Traders peut utiliser pour traiter toutes les ventes de ses magasins tous les soirs. Dans l’unité suivante, nous allons passer en revue ce que vous avez appris, ainsi que quelques conseils à garder en tête.

Vous êtes bloqué ?

Si vous êtes bloqué pendant cet exercice, voici le code complet de ce projet :

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