תרגיל - קריאה וכתיבה לקבצים

הושלם

באפשרותך גם להשתמש File ב- .NET כדי לכתוב נתונים לקבצים ולקרוא נתונים מקבצים.

כמעט סיימת ליצור יצירת מופת של .NET עבור Tailwind Traders. עד כה, הקוד שלך מקריא כל ספריה, מוצא .json הקבצים ו יוצר קובץ totals.txt אחר.

בתרגיל זה, עליך להשלים את הפרוייקט על-ידי .json הקבצים, הוספת הסכומים הכוללים של החנות וכתיבה של הסכום הכולל totals.txt האחסון.

הוספת Newtonsoft.Json לפרוייקט

  1. באמצעות המסוף, הוסף את Newtonsoft.Json לפרוייקט.

    dotnet add package Newtonsoft.Json
    

הכנה לנתונים של מכירות

  1. בחלק העליון של Program.cs, הוסף using Newtonsoft.Json:

    using Newtonsoft.Json;
    
  2. בProgram.cs מתחת לפעולת השירות FindFiles, להוסיף record שמדגמים את sales.json הנתונים:

    record SalesData (double Total);
    

יצירת שיטה המחשבת סכומי מכירות

  1. בProgram.cs, ממש record השורה שהוספת בשלב הקודם, צור פונקציה חדשה המחשבת את סכום המכירות. שיטה זו צריכה לקבל IEnumerable<string> נתיבי קבצים שניתן לבצע עבורם שוב.

    double CalculateSalesTotal(IEnumerable<string> salesFiles)
    {
        double salesTotal = 0;
    
        // READ FILES LOOP
    
        return salesTotal;
    }
    
  2. בתוך שיטה זו, החלף // READ FILES LOOP בלולאה המבצעת איחזרה על-פני salesFiles, מקריאה את הקובץ, מנתחת את התוכן כ- JSON ולאחר מכן מדרגת את משתנה salesTotal בערך total מהקובץ:

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

קריאה לפעולת השירות CalculateSalesTotals

  1. בקובץ Program.cs, הוסף שיחה לפונקציית CalculateSalesTotal ממש מעל 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);
    

כתוב את הסכום הכולל totals.txt הקובץ

  1. בקובץ Program.cs, שנה את File.WriteAllText כדי לכתוב את הערך של המשתנה salesTotal בקובץ ה- totals.txt. כאשר אתה עושה זאת, שנה את File.WriteAllText כדי File.AppendAllText כך שלא יוחלף דבר בקובץ.

    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. שמור את Program.cs הקובץ על-ידי הקשה Ctrl+S / Cmd+S.

הפעל את התוכנית

  1. הפעל את התוכנית מהמסוף:

    dotnet run
    

    אין פלט מהתוכנית. אם אתה מסתכל בקובץ salesTotalDir/totals.txt, תמצא את הסכום הכולל של כל המכירות מהקובץ sales.json שלך.

  2. הפעל שוב את התוכנית מהמסוף.

    dotnet run
    
  3. בחר את salesTotalDir/totals.txt שלך.

    הקובץ totals.txt מכיל כעת שורה שניה. בכל פעם שאתה מפעיל את התוכנית, הסכומים יתווספו שוב ושורה חדשה נכתבת לקובץ.

עבודה מצטיין! כתבת כלי חכם, חזק וחסווי ש- Tailwind Traders יכול להשתמש בו כדי לעבד את כל המכירות של כל החנויות שלו מדי לילה. ביחידה הבאה, נעיין במה שלמדת ועל כמה עצות שיש לזכור.

נתקעת .

אם נתקעת במהלך תרגיל זה, הנה הקוד המלא עבור פרוייקט זה:

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