• السابق التالي







  • يناير
    20
    التعامل مع الملفات و المجلدات عن طريق C#.Net -الجزء الثالث- الملفات الثنائية
    2010
    كتـب بـواسطة : مهند بندق , التصنيف : دروس في البرمجة , عدد المشاهدات (3426)

    لقد تناولنا في الأجزاء السابقة من هذا الدرس:-

    ·         التعامل مع الملفات والمجلدات عن طريق C#.Net -الجزء الأول- Your File Explorer.

    ·         التعامل مع الملفات و المجلدات عن طريق C#.Net -الجزء الثاني- الملفات النصية.

    طرق مختلفة للتعامل مع المجلدات و الملفات بشكل عام و الملفات النصية من حيث فتحها و الكتابة داخلها.

    في هذا الجزء سنتعامل مع جميع أنواع الملفات , مهلا !! ألم تقل الملفات الثنائية ؟!

    نعم فجميع الملفات نصية كانت أو صور أو فيديو , ما هي إلا معلومات ثنائية مخزنة على الهارد ديسك أو موجودة في الرام .. هنا سنقوم بقراءتها وتخزينها في الذاكرة بشكل مؤقت ثم نسخها إلى مكان آخر مثلا .. الخلاصة ما سنتعرف عليه هنا كيفية قراءة الملفات بالبايت والاحتفاظ بها على شكل مصفوفة من البايتات.. وكتابة هذه المصفوفة في ملف آخر .. أو حتى تخزينها في قاعدة البيانات !!

    حسنا ما الفائدة من هذا؟

    على سبيل المثال لا الحصر عزيزي المبرمج , نستطيع بعد إمساك ملف صورة ما على هيئة مصفوفة من البايتات إجراء عمليات عليها عن طريق تقنية GDI+ -تقنية الرسم – وتخزينها من جديد بنسق آخر من أنساق الصور , أو إجراء عملية ضغط للملف وتخزينه بصيغة مختلفة .. ولكن لن نتناول هذه العمليات في هذا الدرس فهو طويل بما فيه الكفاية , وقد نتناولها في دروس أخرى بقدرة الله.

    عندما تعاملنا مع الملفات النصية استعملنا الفئتين StreamReader و StreamWriter هنا لم يختلف الوضع كثيرا فسنستعمل BinaryReader و BinaryWriter بالاستعانة بالفئة Stream ..

    أولا لتعريف الفئة Stream

    Stream MyOpenStream = File.Open("FilePath", FileMode.Open);

    ولإنشاء كائن قراءة BinaryReader

    BinaryReader MyBinaryReader = new BinaryReader(MyOpenStream);

    نستطيع قراءة الملف دفعة واحدة بتعريف مصفوفة من نوع Byte واستدعاء الطريقة Read لكائن القراءة , بتحديد نقطة البداية و النهاية و المصفوفة التي يتم تعبئة البيانات فيها :

    byte[] MyFileBytes = new byte[MyOpenStream.Length];

    MyBinaryReader.Read(MyFileBytes, 0, MyFileBytes.Length);

    هكذا صار الملف عندنا على هيئة مصفوفة من الكائن Byte , كما يمكننا تخزينه في كائن من نوع MemoryStream :

    MemoryStream MyMemoryStream = new MemoryStream(MyFileBytes);

    كما يعتبر MemoryStream أحيانا وسيط لبعض الكائنات مثل Bitmap لكي نتعامل مع بيانات الملف على كونها صورة وإجراء التغيرات عليها في حالة لو كان الملف الأصلي صورة..

    Bitmap MyImage = Bitmap.FromStream(MyMemoryStream);

    ويمكننا إعادة كتابته في ملف آخر عن طريق كائن الكتابة وهو BinaryWriter

    Stream MyNewFile = File.Open("FilePath", FileMode.OpenOrCreate);

    BinaryWriter MyBinaryWriter = new BinaryWriter(MyNewFile);

    MyBinaryWriter.Write(MyFileBytes);

    هذه الطريقة في الكتابة و القراءة فعالة جدا مع الملفات صغيرة الحجم لكن ماذا لو كان حجم الملف يفوق 100 ميجا وليكن 1 GB .. فمن الطبيعي أن يتوقف برنامج عن العمل لفترة ولن يستجيب إلى أوامر المستخدم حتى يكتمل تحميل الملف في الذاكرة ومن جهة أخرى لو كانت الذاكرة المتوفرة Ram في جهاز المستخدم أقل من حجم الملف نفسه !! في هذه الحالة علينا قراءة الملف بايت ورا بايت وكتابته بايت ورا بايت ليتم تحميل وتفريغ البايتات واحد تلوى الآخر ..

    لنخصص إجراء مناسب لنسخ الملفات كبيرة الحجم يستقبل مسار الملف الأصلي و مسار الملف الجديد هكذا

    private void CopyMyFile(string FromFile, string ToFile)

    {

    }

    ولنجهز أيضا عتاد القراءة و الكتابة ليكون الإجراء هكذا

    private void CopyMyFile(string FromFile, string ToFile)

    {

      Stream MyOpenStream = File.Open(FromFile, FileMode.Open);

      Stream MyNewFile = File.Open(ToFile, FileMode.OpenOrCreate);

      BinaryReader MyBinaryReader = new BinaryReader(MyOpenStream);

      BinaryWriter MyBinaryWriter = new BinaryWriter(MyNewFile);

    }

    ثم عمل حلقة تكرارية للقراءة و الكتابة في نفس الوقت ليكون الإجراء كاملا هكذا

    private void CopyMyFile(string FromFile, string ToFile)

    {

     Stream MyOpenStream = File.Open(FromFile, FileMode.Open);

      Stream MyNewFile = File.Open(ToFile, FileMode.OpenOrCreate);

      BinaryReader MyBinaryReader = new BinaryReader(MyOpenStream);

      BinaryWriter MyBinaryWriter = new BinaryWriter(MyNewFile);

      for (long i = 0; i < MyOpenStream.Length; i++)

      {

       MyBinaryWriter.Write(MyBinaryReader.ReadByte());   

      }

      MyNewFile.Close();

      MyOpenStream.Close();

    }

    قمت بإنشاء برنامج ظريف يقوم بنسخ الملفات مع تبيين تقدم النسخ للمستخدم عن طريق أداة ProgressBar .. هذه صورته :-

     

    ولتحميل البرنامج مفتوح المصدر

      

    أرجو أن أكون قد أفدتكم بسلسلة هذه الدروس في التعامل مع الملفات .. وتقبلوا خالص تحياتي..

    مهند بندق..

    و السلام عليكم ورحمة الله وبركاته

     
    التعليقات (2)
    بواسطة الخفاش الأسود من الإمارات العربية المتحدة 21 يناير 2010

    السلام عليكم :

    كل الشكر لك يا باش مهندس على هذا الموقع القيّم ..
    بالفعل إنها سلسلة من الدروس المفيدة والتي استفدت منها أنا شخصياً ,, جعلها الله في ميزان حسناتك وجزاك كل الخير على نشر العلم . موفق ..



    لك كل الاحترام والتقدير .


    بواسطة مهند بندق من طرابلس-ليبيا 21 يناير 2010

    وعليكم السلام

    شكرا اخي "الخفاش الاسود" على مرورك الكريم و الاطراء ..

    وبارك الله فيك على الرد ... عسى أن اكود قد افدتك فعلا..

    تقبل احترامي..

    مهند..






           
    الإسم
    الدولة
    البريد الإلكتروني
    المحتوى  
    أكتب النص الظاهر في الصورة
     





    حقوق النشر محفوظة لـ مهند بندق © 2009 - 2019
    Programmed And Designed By : Mohaned Bondoq
    Copyright © 2009 - 2019