العمل مع نظام الملفات في C#: من الأساسيات إلى التقنيات المتقدمة
العمل مع نظام الملفات هو أحد المهام الأساسية عند تطوير التطبيقات بلغة C#. سواء كان حفظ بيانات المستخدم، أو قراءة ملفات التكوين، أو معالجة السجلات — فإن القدرة على التفاعل بكفاءة مع الملفات والدلائل ضرورية لكل مطور .NET. في هذه المقالة، سنستعرض الفئات الرئيسية لمساحة الأسماء System.IO، ونتعلم كيفية إنشاء الملفات وقراءتها وتعديلها، بالإضافة إلى أفضل الممارسات لمعالجة الأخطاء.
1. الفئات الأساسية للعمل مع نظام الملفات
في .NET، تم توفير عدة فئات رئيسية للعمل مع الملفات والدلائل. دعنا نستعرضها بالتفصيل.
الفئة File و FileInfo
File — فئة ثابتة توفر طرقًا لإنشاء الملفات ونسخها وحذفها ونقلها. FileInfo — فئة مثيلية تسمح بالعمل مع ملف محدد.
using System.IO;
// استخدام الفئة الثابتة Filestring path = @"C:\\Temp\\test.txt";if (File.Exists(path)){ string content = File.ReadAllText(path); Console.WriteLine(content);}
// استخدام FileInfoFileInfo fileInfo = new FileInfo(path);if (fileInfo.Exists){ Console.WriteLine($"حجم الملف: {fileInfo.Length} بايت"); Console.WriteLine($"تاريخ الإنشاء: {fileInfo.CreationTime}");}الفئة Directory و DirectoryInfo
بالمثل، Directory — فئة ثابتة للعمليات على الدلائل، و DirectoryInfo — للعمل مع مجلد محدد.
string dirPath = @"C:\\Temp\\MyFolder";
// إنشاء دليلDirectory.CreateDirectory(dirPath);
// الحصول على معلومات عن الدليلDirectoryInfo dirInfo = new DirectoryInfo(dirPath);if (dirInfo.Exists){ Console.WriteLine($"الدلائل الفرعية: {dirInfo.GetDirectories().Length}"); Console.WriteLine($"الملفات: {dirInfo.GetFiles().Length}");}الفئة Path
Path — فئة مساعدة للعمل مع المسارات. تساعد في دمج المسارات واستخراج الامتدادات وأسماء الملفات.
string fullPath = @"C:\\Temp\\myfile.txt";string fileName = Path.GetFileName(fullPath); // myfile.txtstring extension = Path.GetExtension(fullPath); // .txtstring directory = Path.GetDirectoryName(fullPath); // C:\\Tempstring combined = Path.Combine(@"C:\\Temp", "newfile.txt"); // C:\\Tempewfile.txt2. قراءة وكتابة الملفات
في C#، توجد عدة طرق لقراءة وكتابة الملفات. يعتمد الاختيار على حجم البيانات والأداء المطلوب.
قراءة الملفات النصية
للملفات الصغيرة، من المناسب استخدام الطرق ذات السطر الواحد:
// قراءة الملف بأكمله بسطر واحدstring text = File.ReadAllText("data.txt");
// قراءة جميع الأسطر في مصفوفةstring[] lines = File.ReadAllLines("data.txt");
// القراءة باستخدام StreamReader (للملفات الكبيرة)using (StreamReader reader = new StreamReader("largefile.txt")){ string line; while ((line = reader.ReadLine()) != null) { Console.WriteLine(line); }}الكتابة في الملفات
// كتابة سلسلة نصيةFile.WriteAllText("output.txt", "Hello, World!");
// كتابة مصفوفة من الأسطرstring[] lines = { "السطر الأول", "السطر الثاني" };File.WriteAllLines("output.txt", lines);
// الإلحاق بنهاية الملفFile.AppendAllText("log.txt", $"{DateTime.Now}: إدخال جديد");
// الكتابة باستخدام StreamWriterusing (StreamWriter writer = new StreamWriter("data.txt", append: true)){ writer.WriteLine("سطر جديد");}العمل مع الملفات الثنائية
للبيانات الثنائية، استخدم FileStream و BinaryReader/BinaryWriter:
// كتابة بيانات ثنائيةusing (BinaryWriter writer = new BinaryWriter(File.Open("data.bin"