السلام عليكم
الدرس ده عشان تاسكات الاواس فى الفايل سيستم
---------------------------------------
التعامل مع الملفات سواء عاوز اكتب او اقرى او اجيب معلومات عن الملف ذات نفسه اوا مسح ملف اسمه io -->input/ouput
موجود فى النيم سبيس
using System.IO;
الفايل سيستم عباره عن اما ملفات واما فولدرات (فى لغه البرمجه اسمها directory)
طب والدرايفات راحت فين؟؟
قالك مش هنعتبرها من الفايل سيستم عشان مش ممكن نطبق عليها ميثود الفابل سيستم يعنى مثلا مش ينفع امسح درايف
يبقى كده عندى اتنين كلاس file -directory
كلاسات التعامل مع الملفات فى السى شارب بتنقسم لاتنين من حيث الهدف وطريقه الاستخدام
اول نوع اسمه utility والتانى info
والفرق بين الاتنين
utility --> بنطبق بيها العمليات الاساسيه عل اى ملف زى انقل ملف -امسح ملف- اعمل ملف جديد
اليمثودس فى الكلاس بتاعها من نوع ستاتيك
يعنى لو عاوز اعمل ملف جديد
file.create("c:\\folder");
(خدوا بقالكو ا كتبت اتنين سلاش عشان السلاش ليها معنى خاص فى السى شارب بس انى اقعد اكتب دبل سلاش حركه غبيه خصوصا لو المكان بتاع الفابل طويل
ففيه حركه فى السى شارب نختصر بيها الموضوع نستخدم علامه @ كده
File.Delete(@"c:\folder\filename.html")
لو انا جيت كده وحبيت امسح ملف مش موجود هيطلع علطول Exception
فالحل انى اتكد ان الملف موجود اساسا
if(File.Exists(@"c:\folder\filename.html"))
{
}
اشهر الميثود
copy-create-delete-exists-move-replace
File.GetCreationTime
ديه بتجيب وقت انشاء الملف وممكن نعدل فيه
من
File.SetCreationTime
________________________________
الفولردات نفس الحكايه
Directory.CreateDirectory(Path);
Directory.Exists(Path);
Directory.Move(source, destination);
------------------------------------------------------------
تانى نوع واللى هو info
الكلاس بتاعتها اسمها دايما زى النوع الاول بس مع اضافه info فى الاخر
يعنى
fileinfo-directoryinfo
الميثودس فى النوع ده من نوع instance
فيبقى لازم اعمل اوبجكت
FileInfo file = new FileInfo(Path);
DirectoryInfo folder = new DirectoryInfo(Path);
فايده النوع ده بقى انى بربطه بملف معين
فبجيب كل المعلومات الخاصه بالملف ده
زى acl بتاعه
والبنسبه للميثودس فهيا هيا نفس النوع الاولانى
ويجى السؤال
امتى استخدم ديه او ديه؟؟
لو حضرتك عاوز تنفذ كود عل ملف مره واحده
يبقى النوع الاولانى
لو هتطبق الكود فى اماكن كتيره فى البرنامج
يبقى النوع التانى لان كل اللى عليك هتستخدم الاوبجكت
مش كل مره هتعمل ملف جديد
كمان لو كل اللى هتعمله انك تطلق file operation
الاساسيه زى الكوبى والبست والموف والديليت
يبقى النوع الاولانى
لو عاوز تخش فى صلاحيات الملفات وتلعب فيها يبقى النوع التانى
________________________________________________________________________
ده بقى الجزء المهم فى التاسك
الفولدر جوه فولدرات وملفات
تمام
عاوزين بقى نجيب االفولرات الاول
هتلاقى عندك
string[] subfolders = Directory.GetDirectories(@"c:\");
هترجعلى اراى باسامى السب فولدرز
لما اعوز بقى احول الاسم بتاع السب فودلر لdirectory
DirectoryInfo subfolder=new DirectoryInfo(subfolder[0]);
وعشان هيا اراى فنطبق عليها لوب
وممكن بطريقه تانيه
DirectoryInfo parentFolder = new DirectoryInfo(@"c:\");
DirectoryInfo[] subfolders = parentFolder.GetDirectories();
خدوا بقالو الطريقه الاولى كانت بترجع اراى من السترنج
الطريقه التانيه بترجع directoryinfo
الملفات نفس الطريقه
DirectoryInfo parentFolder = new DirectoryInfo(@"c:\");
FileInfo[] subfolders = parentFolder.GetFiles();
والطريقه التانيه
string[] files = Directory.GetFiles(@"c:\");
___________________________________________________
نجى بقى عل عدد الملفات والفولدرات
دلوقتى انا خلاص جيبت اراى من الملفات مثلا
اجيبهم عددهم ازاى؟؟؟؟؟؟؟؟؟؟
من الكود اللى فات الملفات هترجعلى اراى فممكن اجيب الlength بتاعها
int filesCount=files.length;
نفس الحكايه فى الفولدرات
int subfolders_Count=subfolders.length;
فيه حل تانى ظريف لو انا مش محتاج انى اجيب الاراى اسااسا
int Count = Directory.GetDirectories(@"c:\").Length;
بسسسسسسسسسسسس كده
لا مش بس
لان كل فولدر ممكن يكون جوه سب فولدرات تانيه وكل واحد من السب فولدرز جواه برضك لما ملفات او فولدرات
فالحل حاجه من اتنين
استخدم recursive
او stack
الريكسف انى اعمل ميثود بتجيب اول فولدر
تجيب الفولدرات اللى فيه تخد اول واحد وتنده على نفسها تانى عشان تجيب الفولدرات الىل جواه
وتفضل كده لحد ما تخلص كل السب فولدرز
بالاسلوب ده
public static void GetSubDirectories(string path)
{
string[] childs = Directory.GetDirectories(path);
foreach (string child in childs)
{
GetSubDirectories(child);
}
}
ممكن تغيروا نوع البراميتر لا directoryinfo وتعدولو فى الباقى
الستاك بقى ده درس تانى
https://noor-fci.yoo7.com/montada-f97/topic-t6262.htm
_______________________________________________________
الدريفات بقى
زى ما قولنا مش بتعتبر من الفايل سيستم عشان مش مشتركه مع كلاسات الفايل سيستم فى ميثودس كتيره
التعامل معاها بقى
عاوز اعرف درايف
DriveInfo partition= new DriveInfo(@"c:\");
مش ملاحظين حاجه
انى كتبت اسم الدرايف وقبل كده كتبت نفس الاسم فى كفولدر
ده بقى عشان فى السى شارب
ممكن احول الدرايف لdirectory
لما اجى اتعامل معها بالكود ( مش فى الحقيق)
وده عشان اخش عليه وجيب اللى جواه
DirectoryInfo dir = partition.RootDirectory();
اشهر الميثودس
long freeSize = partiton.AvailableFreeSpace;
بتجيب المساحه الفاضيه
لو عاوزين نعرف نوع الدرايف هو زى السى والدى وكده ولا اسطوانه ولا فلاشه ولا شبكه
DriveType t = partiton.DriveType;
لو عاوزين نجيب بقى الدرايفات اللى فى الجهاز
نفس الطريقه القديمه
DriveInfo[] partitons = DriveInfo.GetDrives();
Exceptionولو حاولنا نعمل لوب نخش بيه عل كل درايف هيعمل
عشان فيه درايفات مش بتبقى جاهزه اننا نخش عليها
زى لو حضرتك مش حاطط اسطوانه فى السيدى روم
الحل انك تتاكد ان الدرايف جاهز
if (partitons[0].IsReady)
{ }
وفى طريقه تانيه تجيب بيها الدرايفات
string[] partitions= Environment.GetLogicalDrives();
بسسسسسسسسسسسسس كده
اى كوسشين
عدل سابقا من قبل cs_senior في الأحد 1 مارس 2009 - 15:39 عدل 1 مرات