عرض مشاركة واحدة
  #1  
قديم 02-28-2010, 10:15 PM
الصورة الرمزية khaledbelal
khaledbelal khaledbelal غير متواجد حالياً
مبرمج المنتدى
الادارة تكليف لا تشريف
 
تاريخ التسجيل: Oct 2009
العمر: 34
المشاركات: 3,606
افتراضي الدرس التاسع والأربعون : System.IO - دورة .net 2008

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

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

الفئات الاساسية في System.IO :

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

هناك فئات اخرى في هذا المجال من الاسماء ، ولكن هذه هي أشهرها وأكثرها استخداماً .

الفوارق بين DirectoryInfo و Directory :

الفارق الأساسي هو في ال structure الخاص بها ، حيث ان Directory مشتقة مباشرة من Object اما DirectoryInfo فهي مشتقة من FileStreamInfo المشتقة بدورها من ال Objects ، اما الفارق في التعامل فهو ان الفئة Directory تعرف دوالها من النوع Static بحيث يمكن استخدامها مباشرة ، اما مع DirectoryInfo فالامر مختلف حيث يتطلب الامر تعريف نسخة قبل استخدام الدوال .
نفس الامر ينطبق بالتبعية على الفرق بين File و FileInfo ...
كلا الفئتين DirectoryInfo و FileInfo تحمل معها الخصائص الاساسية ل FileStreamInfo اضافة لخصائص التعامل مع الملفات والمجلدات ، وهي :

Attributes : تختص بتمرير قيم اضافية للمجلد أو الملف عن طريق ال enumeration المسمى FileAttributes .
CreationTime : قراءة وكتابة تاريخ الانشاء .
Exists : معرفة هل الملف موجود أم لا .
Extension : تعيد امتداد الملف .
FullName : الحصول على المسار كاملاً للملف أو للمجلد .
LastAccessTime : قراءة وكتابة آخر تاريخ للدخول على الملف او المجلد .
LastWriteTime : قراءة وكتابة آخر تاريخ للكتابة في هذا الملف او المجلد .
Name : معرفة اسم الملف أو المجلد .

الفئة DirectoryInfo :

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

Create(), CreateSubdirectory() : انشاء مجلد او مجلد فرعي في المسار المحدد .
Delete() : حذف المجلد وكامل محتوياته .
GetDirectories() : تعيد مصفوفة من الاسماء توضح اسماء المجلدات الفرعية .
GetFiles() : تعيد مصفوفة Array من FileInfo تحتوي على كافة الملفات الموجودة في هذا المجلد .
MoveTo() : نقل المجلد وكافة محتوياته إلى مكان جديد .
Parent : معرفة المجلد الاكبر من هذا المجلد .
Root : لمعرفة ال Driver الخاص بهذا المجلد .

قبل البدء ، انت بحاجة لتعريف نسخة من هذه الفئة ، يمكنك تمرير المكان الذي تود البدء منه في المشيد Constructor بالشكل التالي مثلاً ( لمسار البرنامج ) :

C#:
كود PHP:
DirectoryInfo dir1 = new DirectoryInfo("."); 
vb.net:
كود PHP:
Dim dir1 As New DirectoryInfo("."
او إلى مسار عادي :

C#:
كود PHP:
DirectoryInfo dir1 = new DirectoryInfo("C:\Ahmed"); 
vb.net:
كود PHP:
Dim dir1 As New DirectoryInfo("C:\Ahmed"
*** لو كنت مبرمج سي شارب فلا بد من عدم وضع \ وحدها داخل علامات التنصيص لإن لها استخدامات أخرى مثل \n \r وخلافه ، لكن يمكنك تحديد نوع البيانات بالداخل بأنها مباشرة عن طريق اضافة @ بالشكل التالي مثلاً :
كود PHP:
DirectoryInfo dir1 = new DirectoryInfo(@"C:\Ahmed"); 
ليس فقط بامكانك الربط مع مجلد موجود ، بل يمكنك الربط إلى مجلد غير موجود ومن ثم انشاءه :
C#:
كود PHP:
DirectoryInfo dir1 = new DirectoryInfo(@"C:\Ahmed\Test");
dir1.Create(); 
vb.net:
كود PHP:
Dim dir1 As New DirectoryInfo("C:\Ahmed\Test"
dir1.Create() 
يمكنك ايضاً استعراض كافة الملفات داخل المجلد :
C#:
كود PHP:
FileInfo[] imageFiles dir.GetFiles(); 
vb.net:
كود PHP:
Dim imageFiles As FileInfo() = dir.GetFiles() 
يمكنك استخدام خصائص FileSystemInfo التي تحتوي على كافة المعلومات المتعلقة بالمجلد ، فمثلاً لعرض تاريخ إنشاء المجلد :

C#:
كود PHP:
Console.WriteLine(dir1.CreationTime); 
vb.net:
كود PHP:
Console.WriteLine(dir1.CreationTime
او يمكنك استعراض ملفات من نوع معين فقط ، مثلاً لاستعراض الملفات النصية فقط GIF ومن ثم كتابتها ، لا تنس ان الناتج من نوع FileInfo ويمكن تطبيق خصائص FileSsystemInfo عليها .

C#:
كود PHP:
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\********s\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.Namef.CreationTime);
            }
            
Console.ReadKey();
        }
    }

vb.net:
كود PHP:
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\********s\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.Namef.CreationTime
            
Next 
            
            Console
.ReadKey() 
        
End Sub 
    End 
Class 
End Namespace 
الناتج سيكون بالشكل التالي مثلاً :



التعامل مع الفئة Directory

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

C#:
كود PHP:
System.IO.Directory.Delete(@"C:\ahmed"); 
vb.net:

System.IO.Directory.Delete("C:\ahmed")

التعامل مع الفئة DriveInfo :

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

C#:
كود PHP:

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:
كود PHP:
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() 

التعامل مع FileInfo :

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

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

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

C#:
كود PHP:
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#:
كود PHP:
if ((File.GetAttributes(path) & FileAttributes.Hidden) == FileAttributes.Hidden
vb.net:
كود PHP:
If (File.GetAttributes(path) And FileAttributes.Hidden) = FileAttributes.Hidden Then 
أما لاخفاء الملف نستخدم المعامل OR بالشكل التالي مثلاً :

C#:
كود PHP:
File.SetAttributes(pathFile.GetAttributes(path) | FileAttributes.Hidden); 
vb.net:
كود PHP:
File.SetAttributes(pathFile.GetAttributes(path) Or FileAttributes.Hidden

انشاء وفتح الملفات باستخدام Open :

في الكود التالي ستجد اننا نستخدم الدالة Open مع الخاصية FileMode.OpenOrCreate وهي ما تفيد انه لو وجدت الملف قم بفتحه ، لو لم تجده قم بانشاءه :

C#:
كود PHP:
FileInfo f2 = new FileInfo(@"C:\Test2.txt");
FileStream fs2 f2.Open(FileMode.OpenOrCreate,FileAccess.ReadWriteFileShare.None); 
VB.net:
كود PHP:
Dim f2 As New FileInfo("C:\Test2.txt")

Dim fs2 As FileStream f2.Open(FileMode.OpenOrCreateFileAccess.ReadWriteFileShare.None

هناك حالات أخرى أيضاً لفتح وانشاء الملفات :

CreateNew : انشأ ملف جديد مباشرة ، لو وجدته قم بعمل خطأ IOException
Create : قم بانشاء ملف ولو وجدته قم بانشاءه فوق الموجود .
Open افتح الملف ولو لم تجده قم بعمل خطأ FileNotFoundException
OpenOrCreate : افتح الملف لو كان موجود أو انشأه لو لم يكن موجوداً .
Truncate : افتح الملف وامسح كافة محتوياته
Append : قم بفتح الملف وانتقل لآخره لبدء عملية الكتابة ، لو لم يكن الملف موجوداً قم بفتح واحد جديد والبدء بالكتابة من أوله ، عموماً هي لا تظهر في حالة الفتح باستخدام Open وإنما فقط في حالة OpenWrite .

ال FileAccess ايضاً له ثلاث حالات مجموعة في هذا ال enum .

كود PHP:
public enum FileAccess

{
Read,
Write,
ReadWrite

ال FileShare أيضاً :
كود PHP:
public enum FileShare
{
None,
Read,
Write,
ReadWrite

فتح وانشاء الملفات باستخدام OpenRead و OpenWrite :

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

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

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

مثل السابقة ، الفارق فقط يمكن ان القيمة المعادة ستكون من نوع StreamWritter .
كود PHP:
التعامل مع الفئة File 
نفس ما ذكرنا في حالة المجلدات ، لن تكون مجبراً على تعريف نسخة منها نظراً لإنها Static بل يمكنك العمل عليها مباشرة .
هناك دوال أخرى جديدة في الفئة لعمليات القراءة والكتابة هي :

ReadAllBytes() : قراءة البيانات على شكل array of bytes
ReadAllLines() : قراءة البيانات على شكل مصفوفة من الاسطر .
ReadAllText() : قراءة جميع البيانات كتلة واحدة .
WriteAllBytes() : كتابة byte by byte
WriteAllLines() : الكتابة على شكل اسطر .
WriteAllText() : الكتابة ككتلة واحدة .

ويمكن استخدامهم بالشكل التالي مثلاً - من كتاب ProCSharp 2008:

C#:
كود PHP:
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:
كود PHP:
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
Next 
معلومة اضافية :

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

C#:
كود PHP:
using (CarClass newCare)
{
// do operations

vb.net:
كود PHP:
Using newCare As CarClass 
' do operations
End Using 
لذا سنحاول استخدامها ايضاً مع الملفات حتى لا تبقى معلقة في الذاكرة بالشكل التالي مثلاً :

C#:
كود PHP:
FileInfo f = new FileInfo(@"C:\test.txt");
using(StreamReader reader f.OpenText())
{
// code here

vb.net:
كود PHP:
Dim f As New FileInfo("C:\test.txt"
Using reader As StreamReader f.OpenText() 
        
' code here 
End Using 
إلى هنا نكون قد انتهينا من دروس هذا اليوم ، نواصل غداً إن شاء الله مع دروس Stream .

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


توقيع : khaledbelal



(أَفَأَمِنَ أَهْلُ الْقُرَى أَن يَأْتِيَهُمْ بَأْسُنَا بَيَاتاً وَهُمْ نَآئِمُونَ {97} أَوَ أَمِنَ أَهْلُ الْقُرَى أَن يَأْتِيَهُمْ بَأْسُنَا ضُحًى وَهُمْ يَلْعَبُونَ {98}
أَفَأَمِنُواْ مَكْرَ اللّهِ فَلاَ يَأْمَنُ مَكْرَ اللّهِ إِلاَّ الْقَوْمُ الْخَاسِرُونَ {99}).
سورة الأعراف.

رد مع اقتباس