لماذا مهارة التعامل مع الملفات في C# هي قوة خارقة؟
\n\nتخيل أنك تكتب برنامجًا يجب أن يحفظ إعدادات المستخدم، أو يسجل الأخطاء، أو يعالج آلاف المستندات. بدون مهارات التعامل مع نظام الملفات، ستواجه جدارًا من الصعوبات. في C#، التعامل مع الملفات ليس مجرد قراءة مملة للأسطر. إنها فرصة لإنشاء أدوات قوية، ومحللات، وحتى قواعد بيانات مصغرة.
\n\nفي هذه المقالة، سنشرح كل شيء: من File.ReadAllText البسيط إلى التعامل المتقدم مع التدفقات والمجلدات. ستتعلم كيف لا تفقد البيانات، وكيف تحسن قراءة الملفات الكبيرة، وكيف تتجنب "المزالق" في نظام الملفات. هيا بنا!
الفصول البطلة: File، FileInfo، Directory و Path
\n\nفي .NET، هناك طريقتان للتعامل مع الملفات: الطرق الثابتة للفئة File وطرق الكائنات للفئة FileInfo. الأولى للعمليات السريعة "اقرأ-اكتب"، والثانية عندما تحتاج للتعامل مع ملف واحد لفترة طويلة مع الحفاظ على الحالة.
File مقابل FileInfo: متى تستخدم أيهما؟
\n\nFile هي فئة ثابتة. تكتب File.Exists("test.txt") وينتهي الأمر. مريحة، لكن في كل عملية يتحقق النظام من المسار من جديد.
FileInfo تنشئ كائنًا مرة واحدة، ثم تستدعي الطرق. هذا أسرع إذا كنت تقوم بعدة إجراءات على نفس الملف.
\n\n// الطريقة السريعة\nif (File.Exists(@"C:\\data\\log.txt"))\n{\n string content = File.ReadAllText(@"C:\\data\\log.txt");\n Console.WriteLine(content);\n}\n\n// الطريقة الاحترافية\nFileInfo fileInfo = new FileInfo(@"C:\\data\\log.txt");\nif (fileInfo.Exists)\n{\n using (StreamReader reader = fileInfo.OpenText())\n {\n string content = reader.ReadToEnd();\n Console.WriteLine(content);\n }\n}\n\n\nالفئة Directory تعمل بنفس المبدأ — طرق ثابتة للعمليات السريعة مع المجلدات. Path هو مساعد لا غنى عنه لدمج المسارات: Path.Combine("folder", "file.txt") يضع تلقائيًا الشرطة المائلة الصحيحة.
قراءة الملفات: من الصغير إلى العملاق
\n\nقراءة الملفات في C# هي فن التوازن بين البساطة والأداء. دعنا نشرح ثلاثة مستويات.
\n\nالمستوى 1: كل شيء مرة واحدة (للملفات الصغيرة)
\n\nإذا كان حجم الملف يصل إلى 10 ميجابايت، استخدم ReadAllText أو ReadAllLines بثقة.
string text = File.ReadAllText("config.json");\nstring[] lines = File.ReadAllLines("users.csv");\n\n\nالعيب: مع الملفات الكبيرة، قد تواجه OutOfMemoryException.
المستوى 2: القراءة سطرًا سطرًا (للملفات المتوسطة)
\n\nنستخدم StreamReader — نقرأ سطرًا تلو الآخر، دون تحميل كل شيء في الذاكرة.
using (StreamReader reader = new StreamReader("big_log.txt"))\n{\n string line;\n while ((line = reader.ReadLine()) != null)\n {\n Console.WriteLine(line); // نعالج كل سطر\n }\n}\n\n\nلاحظ استخدام using — فهو يضمن إغلاق الملف حتى في حالة حدوث خطأ.
المستوى 3: قراءة البيانات الثنائية (للمحترفين)
\n\nالتعامل مع الصور، الأرشيفات، أو أي ملفات غير نصية يتطلب FileStream.
using (FileStream fs = new FileStream("photo.jpg", FileMode.Open, FileAccess.Read))\n{\n byte[] buffer = new byte[1024];\n int bytesRead;\n while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)\n {\n // نعالج جزء البيانات\n Console.WriteLine($"تم قراءة {bytesRead} بايت");\n }\n}\n\n\nكتابة الملفات: كيف لا تفقد البيانات
\n\nالكتابة في C# ليست فقط File.WriteAllText. من المهم فهم الأوضاع: إنشاء ملف جديد، الإضافة إلى النهاية، أو إعادة الكتابة.
الأوضاع الأساسية لـ FileMode
\n- \n
- CreateNew<