التمرين - قراءة وكتابة إلى الملفات
يمكنك أيضًا استخدام الفئة 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أسفل الأسلوب مباشرة،FindFilesrecordيقوم بنمذجة بيانات 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; }
استدعاء أسلوب حساب المبيعات الإجمالية
في
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حدد ملف salesTotalsDir/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);