C# Programming

قراءة ملف نصي سطرًا بسطر بكفاءة في C#

Spread the love

تُعد قراءة ملفات النصوص بكفاءة سطرًا بسطر مهارةً أساسية لأي مطور C#. سواء كنت تعالج السجلات، أو تحلل ملفات التكوين، أو تحلل مجموعات البيانات، فإن الطريقة التي تختارها قد تؤثر بشكل كبير على الأداء واستخدام الموارد. تستعرض هذه المقالة ثلاثة أساليب شائعة، مع تسليط الضوء على نقاط قوتها وضعفها لمساعدتك في اختيار التقنية المثلى لاحتياجاتك المحددة.

محتويات

استخدام File.ReadLines()

تُعدُّ طريقة File.ReadLines() بشكل عام الخيار الأكثر كفاءة وراحة، خاصةً بالنسبة للملفات الكبيرة. فهي تُرجع IEnumerable، مما يعني أنها تعالج الملف سطرًا بسطر دون تحميل المحتوى بالكامل في الذاكرة دفعة واحدة. يمنع هذا التحميل الكسول حدوث أخطاء OutOfMemoryException المحتملة عند التعامل مع مجموعات بيانات ضخمة.


using System;
using System.IO;
using System.Linq;

public class ReadLinesExample
{
    public static void Main(string[] args)
    {
        string filePath = "myFile.txt"; 

        try
        {
            foreach (string line in File.ReadLines(filePath))
            {
                Console.WriteLine(line); 
                //معالجة كل سطر هنا
            }
        }
        catch (FileNotFoundException)
        {
            Console.WriteLine($"لم يتم العثور على الملف: {filePath}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"حدث خطأ: {ex.Message}");
        }
    }
}

استخدام File.ReadAllLines()

يوفر File.ReadAllLines() بناء جملة أبسط، حيث يقرأ جميع الأسطر في مصفوفة سلسلة. ومع ذلك، فإن هذا النهج يحمل الملف بأكمله في الذاكرة، مما يجعله غير فعال وقد يكون مشكلةً بالنسبة للملفات الكبيرة. وهو الأنسب للملفات الأصغر حجمًا حيث لا يُعد استهلاك الذاكرة مصدر قلق رئيسيًا.


using System;
using System.IO;

public class ReadAllLinesExample
{
    public static void Main(string[] args)
    {
        string filePath = "myFile.txt";

        try
        {
            string[] lines = File.ReadAllLines(filePath);
            foreach (string line in lines)
            {
                Console.WriteLine(line); 
                //معالجة كل سطر هنا
            }
        }
        catch (FileNotFoundException)
        {
            Console.WriteLine($"لم يتم العثور على الملف: {filePath}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"حدث خطأ: {ex.Message}");
        }
    }
}

استخدام StreamReader.ReadLine()

يوفر StreamReader.ReadLine() التحكم الأكثر دقة. تقرأ سطرًا واحدًا في كل مرة باستخدام حلقة، مما يسمح بمعالجة مخصصة لكل سطر قبل قراءة السطر التالي. تتطلب هذه الطريقة إدارة موارد صريحة باستخدام عبارة using لضمان التخلص السليم من StreamReader.


using System;
using System.IO;

public class StreamReaderExample
{
    public static void Main(string[] args)
    {
        string filePath = "myFile.txt";

        try
        {
            using (StreamReader reader = new StreamReader(filePath))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    Console.WriteLine(line); 
                    //معالجة كل سطر هنا
                }
            }
        }
        catch (FileNotFoundException)
        {
            Console.WriteLine($"لم يتم العثور على الملف: {filePath}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"حدث خطأ: {ex.Message}");
        }
    }
}

اختيار الطريقة الصحيحة

في معظم السيناريوهات، وخاصة عند التعامل مع الملفات الكبيرة، يُوصى باستخدام File.ReadLines() نظرًا لكفاءته وسهولة استخدامه. File.ReadAllLines() مناسب فقط للملفات الأصغر حجمًا. يوفر StreamReader.ReadLine() المزيد من التحكم ولكنه يتطلب إدارة موارد أكثر دقة. تذكر دائمًا تضمين معالجة أخطاء قوية لإدارة الاستثناءات المحتملة مثل أخطاء عدم العثور على الملف بشكل أنيق.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *