תרגיל - קריאה וכתיבה לקבצים
באפשרותך גם להשתמש File ב- .NET כדי לכתוב נתונים לקבצים ולקרוא נתונים מקבצים.
כמעט סיימת ליצור יצירת מופת של .NET עבור Tailwind Traders. עד כה, הקוד שלך מקריא כל ספריה, מוצא .json הקבצים ו יוצר קובץ totals.txt אחר.
בתרגיל זה, עליך להשלים את הפרוייקט על-ידי .json הקבצים, הוספת הסכומים הכוללים של החנות וכתיבה של הסכום הכולל totals.txt האחסון.
הוספת Newtonsoft.Json לפרוייקט
באמצעות המסוף, הוסף את Newtonsoft.Json לפרוייקט.
dotnet add package Newtonsoft.Json
הכנה לנתונים של מכירות
בחלק העליון של
Program.cs, הוסףusing Newtonsoft.Json:using Newtonsoft.Json;ב
Program.csמתחת לפעולת השירותFindFiles, להוסיףrecordשמדגמים את sales.json הנתונים:record SalesData (double Total);
יצירת שיטה המחשבת סכומי מכירות
ב
Program.cs, ממשrecordהשורה שהוספת בשלב הקודם, צור פונקציה חדשה המחשבת את סכום המכירות. שיטה זו צריכה לקבלIEnumerable<string>נתיבי קבצים שניתן לבצע עבורם שוב.double CalculateSalesTotal(IEnumerable<string> salesFiles) { double salesTotal = 0; // READ FILES LOOP return salesTotal; }בתוך שיטה זו, החלף
// 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
בקובץ
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 הקובץ
בקובץ
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}");שמור את Program.cs הקובץ על-ידי הקשה Ctrl+S / Cmd+S.
הפעל את התוכנית
הפעל את התוכנית מהמסוף:
dotnet runאין פלט מהתוכנית. אם אתה מסתכל בקובץ salesTotalDir/totals.txt, תמצא את הסכום הכולל של כל המכירות מהקובץ sales.json שלך.
הפעל שוב את התוכנית מהמסוף.
dotnet runבחר את 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);