تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
الدرس التاسع والأربعون : System.IO
#1
كاتب الموضوع احمد جمال

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

نعود بعد انقطاع وهذه المرة مع .NET Base Class Libraries أو الفئات الاساسية في الدوت نت ، موعدنا اليوم مع الفئة System.IO والتي تنظم كافة عمليات الادخال والاخراج والتعامل مع الملفات .

الفئات الاساسية في System.IO :
[COLOR="#FF0000"]
BinaryReader, BinaryWriter [/COLOR]: تتيح لك قراءة وكتابة بياناتك على شكل Binary Files .
BufferedStream : مخزن مؤقت للبيانات Buffer التي يمكن أن تأخذ طريقها لاحقاً إلى الذاكرة .[COLOR="#FF0000"]
Directory, DirectoryInfo [/COLOR]: مختص بالتعامل مع المجلدات والمعلومات المتعلقة بها .
DriveInfo : مختص بالتعامل ومعرفة المعلومات عن وحدات التخزين في جهازك Driver .
File, FileInfo : مختص بالتعامل مع الملفات وكل ما يتعلق بها .
FileStream : يمكنك من الوصول للملفات وعرض البيانات على شكل Stream .
FileSystemWatcher : مراقبة ملف او مجلد واخبارك بالتعديلات التي تطرأ عليه .
Path : مختص بالتعامل مع المتغيرات النصية لتحويل المسارات إلى صور مفهومة لنظام التشغيل .
StreamWriter, StreamReader : القراءة والكتابة إلى الملفات بصورة نصية .
StringWriter, StringReader : نفس السابق ، فقط مع اختلاف ان ال Reader وال Writter يتم انشاءه من ال String .

هناك فئات اخرى في هذا المجال من الاسماء ، ولكن هذه هي أشهرها وأكثرها استخداماً .
الرد }}}
تم الشكر بواسطة:
#2
الفوارق بين DirectoryInfo و Directory :

الفارق الأساسي هو في ال structure الخاص بها ، حيث ان Directory مشتقة مباشرة من Object اما DirectoryInfo فهي مشتقة من FileStreamInfo المشتقة بدورها من ال Objects ، اما الفارق في التعامل فهو ان الفئة Directory تعرف دوالها من النوع Static بحيث يمكن استخدامها مباشرة ، اما مع DirectoryInfo فالامر مختلف حيث يتطلب الامر تعريف نسخة قبل استخدام الدوال .
نفس الامر ينطبق بالتبعية على الفرق بين File و FileInfo ...
كلا الفئتين DirectoryInfo و FileInfo تحمل معها الخصائص الاساسية ل FileStreamInfo اضافة لخصائص التعامل مع الملفات والمجلدات ، وهي :
[COLOR="#008000"]
Attributes : تختص بتمرير قيم اضافية للمجلد أو الملف عن طريق ال enumeration المسمى FileAttributes .
CreationTime : قراءة وكتابة تاريخ الانشاء .
Exists : معرفة هل الملف موجود أم لا .
Extension : تعيد امتداد الملف .
FullName : الحصول على المسار كاملاً للملف أو للمجلد .
LastAccessTime : قراءة وكتابة آخر تاريخ للدخول على الملف او المجلد .
LastWriteTime : قراءة وكتابة آخر تاريخ للكتابة في هذا الملف او المجلد .
Name : معرفة اسم الملف أو المجلد .[/COLOR]
الرد }}}
تم الشكر بواسطة:
#3
الفئة DirectoryInfo :

اضافة لاحتواءها على الخصائص السابقة من FileStreamInfo ، تحتوي هذه الفئة على الدوال التالية :

[COLOR="#006400"]Create(), CreateSubdirectory() : انشاء مجلد او مجلد فرعي في المسار المحدد .
Delete() : حذف المجلد وكامل محتوياته .
GetDirectories() : تعيد مصفوفة من الاسماء توضح اسماء المجلدات الفرعية .
GetFiles() : تعيد مصفوفة Array من FileInfo تحتوي على كافة الملفات الموجودة في هذا المجلد .
MoveTo() : نقل المجلد وكافة محتوياته إلى مكان جديد .
Parent : معرفة المجلد الاكبر من هذا المجلد .
Root : لمعرفة ال Driver الخاص بهذا المجلد .
[/COLOR]
قبل البدء ، انت بحاجة لتعريف نسخة من هذه الفئة ، يمكنك تمرير المكان الذي تود البدء منه في المشيد Constructor بالشكل التالي مثلاً ( لمسار البرنامج ) :
C#:
كود :
DirectoryInfo dir1 = new DirectoryInfo(".");

vb.net:
رمز برمجي:

كود :
Dim dir1 As New DirectoryInfo(".")

او إلى مسار عادي :
C#:
رمز برمجي:


كود :
DirectoryInfo dir1 = new DirectoryInfo("C:\Ahmed");

vb.net:
رمز برمجي:


كود :
Dim dir1 As New DirectoryInfo("C:\Ahmed")

*** لو كنت مبرمج سي شارب فلا بد من عدم وضع \ وحدها داخل علامات التنصيص لإن لها استخدامات أخرى مثل \n \r وخلافه ، لكن يمكنك تحديد نوع البيانات بالداخل بأنها مباشرة عن طريق اضافة @ بالشكل التالي مثلاً :
رمز برمجي:

كود :
DirectoryInfo dir1 = new DirectoryInfo(@"C:\Ahmed");



ليس فقط بامكانك الربط مع مجلد موجود ، بل يمكنك الربط إلى مجلد غير موجود ومن ثم انشاءه :
C#:
رمز برمجي:

كود :
DirectoryInfo dir1 = new DirectoryInfo(@"C:\Ahmed\Test");
dir1.Create();

vb.net:
رمز برمجي:

كود :
Dim dir1 As New DirectoryInfo("C:\Ahmed\Test")
dir1.Create()

يمكنك ايضاً استعراض كافة الملفات داخل المجلد :
C#:
رمز برمجي:


كود :
FileInfo[] imageFiles = dir.GetFiles();

vb.net:
رمز برمجي:


كود :
Dim imageFiles As FileInfo() = dir.GetFiles()

يمكنك استخدام خصائص FileSystemInfo التي تحتوي على كافة المعلومات المتعلقة بالمجلد ، فمثلاً لعرض تاريخ إنشاء المجلد :
C#:
رمز برمجي:


كود :
Console.WriteLine(dir1.CreationTime);

vb.net:
رمز برمجي:


كود :
Console.WriteLine(dir1.CreationTime)

او يمكنك استعراض ملفات من نوع معين فقط ، مثلاً لاستعراض الملفات النصية فقط GIF ومن ثم كتابتها ، لا تنس ان الناتج من نوع FileInfo ويمكن تطبيق خصائص FileSsystemInfo عليها .
C#:
رمز برمجي:
كود :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            DirectoryInfo dir1 = new DirectoryInfo(@"C:\Users\Ahmed\Documents\Visual Studio 2008\WebSites\WebSite4");
            FileInfo[] imageFiles = dir1.GetFiles("*.gif");
            foreach (FileInfo f in imageFiles)
            {
                Console.WriteLine("Name: {0} - Creation Date: {1} . \n\n", f.Name, f.CreationTime);
            }
            Console.ReadKey();
        }
    }
}

vb.net:

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.IO
Namespace ConsoleApplication7
Class Program
Private Shared Sub Main(ByVal args As String())
Dim dir1 As New DirectoryInfo("C:\Users\Ahmed\Documents\Visual Studio 2008\WebSites\WebSite4")
Dim imageFiles As FileInfo() = dir1.GetFiles("*.gif")

For Each f As FileInfo In imageFiles
Console.WriteLine("Name: {0} - Creation Date: {1} . " & Chr(10) & "" & Chr(10) & "", f.Name, f.CreationTime)
Next

Console.ReadKey()
End Sub
End Class
End Namespace

الناتج سيكون بالشكل التالي مثلاً :
[ATTACH=CONFIG]907[/ATTACH]


الملفات المرفقة صورة/صور
   
الرد }}}
تم الشكر بواسطة:
#4
التعامل مع الفئة Directory

لا شيء جديد ، فقط ستفقد الخصائص المتاحة من خلال الفئة FileSystemInfo وفي المقابل لن تكون محتاجاً لتعريف نسخة قبل البدء بالعمل ، لذا يمكنك العمل على الفئة مباشرة بالشكل التالي مثلاً لعملية الحذف :
C#:
كود :
System.IO.Directory.Delete(@"C:\ahmed");

vb.net:

كود :
System.IO.Directory.Delete("C:\ahmed")
الرد }}}
تم الشكر بواسطة:
#5
التعامل مع الفئة DriveInfo :

تتيح لك هذه الفئة استعراض ال Drivers في جهازك ومعرفة بعض المعلومات عنها ، هذا المثال مباشرة من كتاب Pro.CSharp 2008 :

C#:
كود :
Console.WriteLine("***** Fun with DriveInfo *****\n");
// Get info regarding all drives.
DriveInfo[] myDrives = DriveInfo.GetDrives();
// Now print drive stats.
foreach(DriveInfo d in myDrives)
{
Console.WriteLine("Name: {0}", d.Name);
Console.WriteLine("Type: {0}", d.DriveType);
// Check to see whether the drive is mounted.
if (d.IsReady)
{
Console.WriteLine("Free space: {0}", d.TotalFreeSpace);
Console.WriteLine("Format: {0}", d.DriveFormat);
Console.WriteLine("Label: {0}", d.VolumeLabel);
Console.WriteLine();
}
}
Console.ReadLine();

vb.net:

كود :
Console.WriteLine("***** Fun with DriveInfo *****" & Chr(10) & "")
' Get info regarding all drives.
Dim myDrives As DriveInfo() = DriveInfo.GetDrives()
' Now print drive stats.
For Each d As DriveInfo In myDrives
    Console.WriteLine("Name: {0}", d.Name)
    Console.WriteLine("Type: {0}", d.DriveType)
    ' Check to see whether the drive is mounted.
    If d.IsReady Then
        Console.WriteLine("Free space: {0}", d.TotalFreeSpace)
        Console.WriteLine("Format: {0}", d.DriveFormat)
        Console.WriteLine("Label: {0}", d.VolumeLabel)
        Console.WriteLine()
    End If
Next
Console.ReadLine()
الرد }}}
تم الشكر بواسطة:
#6
التعامل مع FileInfo :

الدوال الرئيسية في هذه الفئة - اضافة بالطبع للخصائص العادية - :

AppendText() : انشاء StreamWritter للكتابة في الملف
CopyTo() نسخ .
Create() انشاء ملف واعادة كائن FileStream
CreateText() : انشاء StreamWriter للكتابة في الملف
Delete() : حذف الملف
Directory : معرفة اسم المجلد
DirectoryName : معرفة مسار المجلد
Length : معرفة حجم الملف
MoveTo() : النقل ، يمكنك تحديد اسم جديد للملف المنقول
Name : اسم الملف
Open() : فتح الملف مع امكانية القراءة والكتابة وخلافه
OpenRead() : فتح الملف للقراءة فقط
OpenText() : فتح الملف باستخدام StreamReader
OpenWrite() : فتح الملف للكتابة فقط

بعيداً عن خواص StreamReader والتي سنتعرف عليها تفصيلاً في جزء لاحق من هذه الدروس . سنتعرف على باقي الخصائص .
لانشاء ملف مثلاً باستخدام Create :

C#:

كود :
FileInfo f = new FileInfo(@"C:\Test.txt");
FileStream fs = f.Create();

vb.net:

كود :
Dim f As New FileInfo("C:\Test.txt")
Dim fs As FileStream = f.Create()

طبعاً لا تنس أن بامكانك استخدام أي من الخصائص الموجودة في FileSystemInfo كما سبق ، فقط الخاصية Attributes هي خاصية مميزة نوعاً ما حيث تشمل عدة تفاصيل ، حيث يمكنك من خلالها تحديد إذا كان الملف مخفي ام ظاهر ، للقراءة فقط ... الخ .

مثلاً لمعرفة هل الملف مخفي أم لا ؟
C#:


كود :
if ((File.GetAttributes(path) & FileAttributes.Hidden) == FileAttributes.Hidden)

vb.net:

كود :
If (File.GetAttributes(path) And FileAttributes.Hidden) = FileAttributes.Hidden Then

أما لاخفاء الملف نستخدم المعامل OR بالشكل التالي مثلاً :
C#:

كود :
File.SetAttributes(path, File.GetAttributes(path) | FileAttributes.Hidden);

vb.net:

كود :
File.SetAttributes(path, File.GetAttributes(path) Or FileAttributes.Hidden)
الرد }}}
تم الشكر بواسطة:
#7
انشاء وفتح الملفات باستخدام Open :

في الكود التالي ستجد اننا نستخدم الدالة Open مع الخاصية FileMode.OpenOrCreate وهي ما تفيد انه لو وجدت الملف قم بفتحه ، لو لم تجده قم بانشاءه :
C#:
كود :
FileInfo f2 = new FileInfo(@"C:\Test2.txt");
FileStream fs2 = f2.Open(FileMode.OpenOrCreate,FileAccess.ReadWrite, FileShare.None);

VB.net:

كود :
Dim f2 As New FileInfo("C:\Test2.txt")

كود :
Dim fs2 As FileStream = f2.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)

هناك حالات أخرى أيضاً لفتح وانشاء الملفات :
[COLOR="#008000"]
CreateNew : انشأ ملف جديد مباشرة ، لو وجدته قم بعمل خطأ IOException
Create : قم بانشاء ملف ولو وجدته قم بانشاءه فوق الموجود .
Open افتح الملف ولو لم تجده قم بعمل خطأ FileNotFoundException
OpenOrCreate : افتح الملف لو كان موجود أو انشأه لو لم يكن موجوداً .
Truncate : افتح الملف وامسح كافة محتوياته
Append : قم بفتح الملف وانتقل لآخره لبدء عملية الكتابة ، لو لم يكن الملف موجوداً قم بفتح واحد جديد والبدء بالكتابة من أوله ، عموماً هي لا تظهر في حالة الفتح باستخدام Open وإنما فقط في حالة OpenWrite .
[/COLOR]
ال FileAccess ايضاً له ثلاث حالات مجموعة في هذا ال enum .
كود :
public enum FileAccess

كود :
{
Read,
Write,
ReadWrite
}

ال FileShare أيضاً :

كود :
public enum FileShare
{
None,
Read,
Write,
ReadWrite
}
الرد }}}
تم الشكر بواسطة:
#8
فتح وانشاء الملفات باستخدام OpenRead و OpenWrite :

مثل ما سبق ، عدا انك ستكون ملزماً بنوع واحد فقط من العمليات .

فتح الملفات باستخدام OpenText :
الفارق الوحيد هو ان القيمة المعادة تكون من نوع StreamReader وليس FileStream ، بالشكل التالي مثلاً :
C#:
كود :
FileInfo f5 = new FileInfo(@"C:\boot.ini");
StreamReader sreader = f5.OpenText();

vb.net:

كود :
Dim f5 As New FileInfo("C:\boot.ini")
Dim sreader As StreamReader = f5.OpenText()

الفتح باستخدام CreateText و AppendText :

مثل السابقة ، الفارق فقط يمكن ان القيمة المعادة ستكون من نوع StreamWritter .
الرد }}}
تم الشكر بواسطة:
#9
التعامل مع الفئة File :

نفس ما ذكرنا في حالة المجلدات ، لن تكون مجبراً على تعريف نسخة منها نظراً لإنها Static بل يمكنك العمل عليها مباشرة .
هناك دوال أخرى جديدة في الفئة لعمليات القراءة والكتابة هي :
[COLOR="#008000"]
ReadAllBytes() : قراءة البيانات على شكل array of bytes
ReadAllLines() : قراءة البيانات على شكل مصفوفة من الاسطر .
ReadAllText() : قراءة جميع البيانات كتلة واحدة .
WriteAllBytes() : كتابة byte by byte
WriteAllLines() : الكتابة على شكل اسطر .
WriteAllText() : الكتابة ككتلة واحدة .[/COLOR]

ويمكن استخدامهم بالشكل التالي مثلاً - من كتاب ProCSharp 2008:
C#:
كود :
string[] myTasks = {
"Fix bathroom sink", "Call Dave",
"Call Mom and Dad", "Play Xbox 360"};
// Write out all data to file on C drive.
File.WriteAllLines(@"C:\tasks.txt", myTasks);
// Read it all back and print out.
foreach (string task in File.ReadAllLines(@"C:\tasks.txt"))
{
Console.WriteLine("TODO: {0}", task);
}

vb.net:

كود :
Dim myTasks As String() = {"Fix bathroom sink", "Call Dave", "Call Mom and Dad", "Play Xbox 360"}
' Write out all data to file on C drive.
File.WriteAllLines("C:\tasks.txt", myTasks)
' Read it all back and print out.
For Each task As String In File.ReadAllLines("C:\tasks.txt")
    Console.WriteLine("TODO: {0}", task)
الرد }}}
تم الشكر بواسطة:
#10
معلومة اضافية :

*** في .net ، يمكن للفئة إذا كانت implemented ل IDisposable ان نقوم بتعريفها في مكان ومن ثم حذفها خارج هذا النطاق بالشكل التالي مثلاً :
C#:

كود :
using (CarClass newCare)
{
// do operations
}
vb.net:

كود :
Using newCare As CarClass
' do operations
End Using

لذا سنحاول استخدامها ايضاً مع الملفات حتى لا تبقى معلقة في الذاكرة بالشكل التالي مثلاً :

C#:

كود :
FileInfo f = new FileInfo(@"C:\test.txt");
using(StreamReader reader = f.OpenText())
{
// code here
}
vb.net:
كود :
Dim f As New FileInfo("C:\test.txt")
Using reader As StreamReader = f.OpenText()
        ' code here
End Using


إلى هنا نكون قد انتهينا من دروس هذا اليوم ، نواصل غداً إن شاء الله مع دروس Stream .

[COLOR="#00FF00"]والله الموفق ...
والسلام عليكم ورحمة الله وبركاته .[/COLOR]
الرد }}}
تم الشكر بواسطة:



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم