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







  • ديسمبر
    17
    التعامل مع الملفات والمجلدات عن طريق C#.Net -الجزء الأول- Your File Explorer
    2009
    كتـب بـواسطة : مهند بندق , التصنيف : دروس في البرمجة , عدد المشاهدات (3606)

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

    في بعض مواضيعي السابقة اتبعت اسلوب ,, كلام أقل- كود أكثر  .. ولكن لنعكس هذا الاسلوب لعله يفيد أكبر شريحة من المبرمجين المبتدئين و الارتقاء بهم إلى اسلوب الفهم عوضا عن اسلوب (نسخ, لصق).. و الاعتماد على الذات في كتابة الشفرات عوضا عن البحث عنها ..

    بسم الله نبدأ :-

    كما تعرف عزيزي المبرمج إن كل ما نستعمله من أدوات هو بالأحرى فئات أو Classes التي استطيع تعريفها بأنها حاوية لمجموعة من الاجراءات تربطهم علاقة مشركة .. وهذه الـ Classes  موجودة ضمن مكتبات كبيرة Class Library .. بداخلها مجالات اسماء التي تحضن الفئات حيث يتم منادتها بها .

    مجال الاسماء الذي سنستعمله للتعامل مع الملفات هو System.IO .. و الذي يحتوي على العديد من الكائنات أي الفئات التي نستطيع استعمالها في هذا المجال ..

    ومن أبرز هذه الفئات التي سنتطرق إلى استعمالها في سلسلة هذه الدروس هي .

    Path – للتعامل مع مسارات الملفات ومعرفة مكانها ومعلومات عنها .

    Directory – للتعامل مع المجلدات أو الأدلة بكل الأشكال.

    DirectoryInfo – للتعامل بشكل أعمق مع خصائص المجلد وما إلى ذلك.

    File – للتعامل مع الملف بذاته.

    FileInfo – للتعامل أو لاستخدام معلومات حول ملف معين و التعديل فيها.

    Stream – للتعامل مع ما بداخل الملفات .. بالاستعانة إلى بناتها ..

    FileStream –للعامل مع ما بداخل الملف .

    و بشكل أكثر تخصيص StreamReader للقرائة , و StreamWriter للكتابة .

    MemoryStream - للتعامل مع الملفات في الذاكرة .. يشبه إلى حد كبير مصفوفة من البايتات Byte[] ..

    ملاحظة الفئة FileStream قد تعمل عوضا عن StreamWriter و StreamReader , ولكن لا تحتوي على جميع خصائصهم .. بالتالي يستحسن استعمال كل فئة للغرض المخصص لها ..

    كما أن الفئة Files  قد تحتوي على بعض مزايا FileStream ولكن تفتقر للكثير من مزاياها.

    كفانا ثرثرة ولنكتب بعض الكود .. :)

    سنتناول التعامل مع المجلدات عن طريق الفئة Directory و DriveInfo و التعامل مع الملفات عن طريق File و FileInfo..

    أهم طريقة في هذه الفئة "Directory" – مع ملاحظة أن جميع الطرق استاتيكية فلا حاجة لنا لتعريفها بـ New  - وهي Directory.GetFiles تعود بمصفوفة لجميع الملفات الموجودة داخل الموجودة داخل المجلد ..وتستعمل على هذا النحو.

    string[] ALLWindowsFiles = Directory.GetFiles(@"C:\Windows");

    قمنا بتعريف مصفوفة Strings لكي نحتضن فيها جميع أسماء ملفات مجلد الويندوز الذي لابد من وجوده في كل جهاز يستعمل اطار .Net !

    ان لم تستطع تخيل المخرجات .. فقط اعمل حلقة تكرارية لمشاهدة النتائج على أداة List Box  على سبيل المثال لا الحصر ...

    هكذا

    foreach (string i in ALLWindowsFiles)

    {

     listBox1.Items.Add(i);

    }

    أو عوضا عن الحلقة السابقة استعمل الطريقة ..

    listBox1.Items.AddRange(ALLWindowsFiles);

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

    حسنا هكذا عرضنا الملفات ماذا عن المجلدات ؟؟

    GetDirectories لا تحزن فيوجد الطريقة

    string[] ALLWindowsFolders = Directory.GetDirectories(@"C:\Windows");

    وقم بإضافتها إلى ListBox بنفسك .

    لنرى ذلك بشكل أكثر وضوح نستعمل أداة أخرى غير ListBox  وهي listView ونعين خاصية SmallImageList و LargeImageList إلى imageList1  الكائن المتخصص في حضن الصور على هيئة قائمة صور لنستعملها فيما بعد بالإشارة إلى خاصية index للصورة المراد استعمالها .. بأسلوب أكثر تحضر هذه الأداة ما هي إلا مصفوفة من كائن Image !! ونضع فيه الصور التي نريد استعمالها واحدة للملفات وأخرى للمجلدات .

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

    foreach (string i in ALLWindowsFiles)

    {

     listView1.Items.Add(i,1);

    }

    foreach (string i in ALLWindowsFolders)

    {

     listView1.Items.Add(i,0);

    }

    الرقم 0 يمثل index الصورة الأولى , و الرقم 1 يمثل index الصورة الثانية .

    ولكن سيضيف الملفات بكامل مسارها , ولجعلها بالاسم فقط .. سنستعمل الفئتين DirectoryInfo و FileInfo للتعرف على أسماء الملفات و المجلدات وليس مساراتها .

    نقوم بتعريف الأخير هكذا :

    FileInfo MyFile = new FileInfo("FilePath");

    حيث FilePath تمثل مسار الملف

    DirectoryInfo MyDir = new DirectoryInfo("FolderPath");

    حيث FolderPath هو مسار المجلد ..

     

    والخاصية Name  تمثل اسم الملف كما تقوم الخاصية Extension  بإعادة إمتداد الملف !

    وليتم استعمال هذه الميزة في الحلقة السابقة نقوم بإعادة كتابتها على هذا النحو

    foreach (string i in ALLWindowsFiles)

    {

    FileInfo MyFile = new FileInfo(i);

    listView1.Items.Add( MyFile.Name,1);

    }

    حيث i يمثل مسار الملف في كل دورة.

    و بالطبع تتشابه الفئة DirectoryInfo مع سابقتها FileInfo

    لتكون الحلقة هكذا

    foreach (string i in ALLWindowsFolders)

    {

    DirectoryInfo MyDir = new DirectoryInfo(i);

    listView1.Items.Add(MyDir.Name,0);

    }

    لتظهر المخرجات على هذا الشكل

     

    نستطيع كتابة حلقاتنا لتظهر بشكل أكثر أناقة وجدية .. بحيث نقوم بفلترة نوع الملف في حالة كونه exe  سنغير أيقونة أو صورة أخرى له أي تلك التي تحمل رقم 3 .. وفي حالة إن لم يكن نضع الصورة العادية التي تحمل الرقم 1.. و بالنسبة للمجلدات في حالة كونها مخفية نظهرها بأيقونة من اللون الأحمر تحمل الرقم 2 ..و في حالة عدم توفر هذا الشرط  حيث نعرض الأيقونة رقم 0.

    وعملية الفلترة تتم بالشرط if  أي إذا كان ملفنا بامتداد EXE  سنضع الأيقونة رقم كذا و إذا لم يكن بهذا الامتداد نضع أيقونة أخرى...

    if (MyFile.Extension ==".exe")

    {

                       

    }

    لتكون الحلقة كاملة هكذا

    foreach (string i in ALLWindowsFiles)

    {

    FileInfo MyFile = new FileInfo(i);

    if (MyFile.Extension ==".exe")

    {

    listView1.Items.Add(MyFile.Name, 3);

    }

    else

    {

    listView1.Items.Add(MyFile.Name, 1);

    }

    }

    لنميز الملفات التنفيذية عن غيرها

    وبالطبع سننفذ شرطنا الآخر على حلقة المجلدات

    foreach (string i in ALLWindowsFolders)

    {

    DirectoryInfo MyDir = new DirectoryInfo(i);

    if ((File.GetAttributes(i) & FileAttributes.Hidden) == FileAttributes.Hidden)

    {

    listView1.Items.Add(MyDir.Name, 2);

    }

    else

    {

    listView1.Items.Add(MyDir.Name, 0);

    }

    }

    لنميز المجلدات المخفية عن غيرها

    وبإمكانك عزيزي المبرمج الاستمرار في عملية الفلترة مثلا عن طريق switch .. حيث تظهر ملفات mp3 بشكل مختلف عن exe و avi .. وهكذا .. 

    أريد أن أشير لفئة أخرى مهمة جدا وهي DriveInfo وبها طريقة إستاتيكية  تسمى GetDrives لجلب جميع الأقراص الموصلة بجهازك .. في مصفوفة من نفس الكائن .. بهذا الكود.

    DriveInfo[] AllDrivers = DriveInfo.GetDrives();

    وتستطيع إجراء عمليات على العناصر .. أو إضافتها .. أو معرفة نوعها عن طريق DriveType والتي عبارة عن enum تعود بنوع القرص .. لنقم بإضافته إلى ListView أخرى ولتكن 2ListView .. وكتابة هذا الكود

    DriveInfo[] AllDrivers = DriveInfo.GetDrives();

    foreach (DriveInfo i in AllDrivers)

    {

    switch (i.DriveType)

    {

    case DriveType.CDRom:

    listView2.Items.Add(i.Name, 0);

    break;

    case DriveType.Fixed:

    listView2.Items.Add(i.Name, 1);

    break;

    case DriveType.Network:

    listView2.Items.Add(i.Name, 2);

    break;

    case DriveType.Removable:

    listView2.Items.Add(i.Name, 3);

    break;

    }

    }

    فقط يتم وضع الأيقونة المناسبة لكل نوع كما في الصورة ..

    في نهاية هذا الجزء سأذكر الأوامر الأساسية في فئتي File و Directory

    File.Delete("FilePath");

    File.Move("FilePath","NewPath");

    File.Copy("FilePath","NewPath");

    Directory.Delete("FolderPath");

    Directory.Move("FolderPath","NewFolderPath");

    Directory.CreateDirectory

     

     

    كما نستطيع استعمال Move لإعادة التسمية للملف أو المجلد ..و الخاصية Exists للتحقق من وجود ملف أو مجلد قبل إجراء أي عمليات عليه حتى لا تحصل استثناءات أي أخطاء.

    وأترك لكم استكشاف بقية إجراءات هذه الـ Classes ..

    تحميل المثال من هنا

                                    

    ملاحظة أخيرة : تستطيع تطوير المثال لإنشاء Your File Explorer متصفح أو مستكشف للملفات خاص بك .. حيث بالنقر على أي عنصر يتم فتح ما بداخله .. وسأتركه لكم.

    ونلتقي في الجزء الثاني قريبا..الذي سيحتوي على التعامل مع الملفات و الكتابة داخلها عن طريق Filestream وشبيهتها MemoryStream و التعرف على الفئة Path ...  أتمنى لكم الاستفادة وأن تعم الفائدة..

    وتقبلوا مني أطيب التحيات

    مهند بندق

     
    التعليقات (1)
    بواسطة منال من السعودية 5 مايو 2013

    شكرا جززيلا على الدرس الاكثر من رائع انت مبدع في تبسيطك للفكرة وتوضيحها
    جزاك الله خيرا ووفقك الله لكل خير






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





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