المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : الدرس الخمسون : System.IO - الجزء الثاني - دورة .net 2008


khaledbelal
03-01-2010, 01:37 PM
بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .

نواصل هنا درسنا الذي بدأناه في الجزء السابق عن System.IO .

Stream :

ال Stream يقصد به تدفق او نقل البيانات ما بين مصدر ومستقبل سواء كان ذلك بين ملفين او بين جهازين على الشبكة أو طابعة أو خلافه ، حيث يتم نقل البيانات في الغالب على شكل
sequance of bytes حتى نهاية الملف أو البيانات .
في .net ، هناك الفئة System.IO.Stream والتي تعتبر الفئة الأم التي سنتعامل مع غالب فئاتها لاحقاً ، تحتوي هذه الفئة على الدوال والخصائص الرئيسية التالية -
abstract class - :

CanRead, CanWrite : خصائص تتيح لك معرفة إذا كانت عملية ال Stream هذه تقبل عملية الكتابة أو القراءة وغيرها .
Close() : اغلاق العملية وكل ما يتعلق بها من ملفات وخلافه .
Flush() : تحديث بيانات المستقبل بالبيانات الموجودة حالياً في Buffer ، لو لم يكن هذه العملية تدعم وجود Buffer فهذه الدالة لا تقوم بأي شيء في الواقع .
Length : خاصية تعيد حجم ال stream بالبايت .
Position : تحدد المكان في ال stream .
Read(), ReadByte() : قراءة بايت او مجموعة من bytes .
Seek() : وضع المؤشر في مكان جديد في هذا ال stream .
SetLength() : تحديد طول ال stram الحالي :
Write(), WriteByte() : كتابة بايت او مجموعة من ال bytes .

الفئة File Stream :

هذه الفئة التي تطبق الفئة القاعدية abstract class السابق تختص فقط بالتعامل مع ال streaming مع الملفات .
المثال التالي يوضح الكتابة في عدة أماكن من الملف ومن ثم قراءة البيانات المكتوبة - قبل الكتابة فقط نحتاج لتحويل الرسالة إلى bytes لذا لا تنس هذه الخطوة .

C#:

private void filestreamexample(string msg, string beforeendmsg)
{
using(FileStream f1 = File.Open(@"C:\test.txt",
FileMode.Create))
{
byte[] msgArray = Encoding.Default.GetBytes(msg);
byte[] beforeendmsgArray = Encoding.Default.GetBytes(beforeendmsg);
f1.Write(msgArray , 0, msgArray.Length);
f1.Position = fStream.Lenght-10;
f1.Write(beforeendmsgArray , 0, msgAsByteArray.Length);

// view total message.
long totalLenght=msgArray.Length + msgAsByteArray.Length;
byte[] filemsg = new byte[totalLenght];
for (int i = 0; i < totalLenght; i++)
filemsg[i] = (byte)f1.ReadByte();

Console.WriteLine(Encoding.Default.GetString(filem sg));
}
}

vb.net:

Private Sub filestreamexample(ByVal msg As String, ByVal beforeendmsg As String)
Using f1 As FileStream = File.Open("C:\test.txt", FileMode.Create)
Dim msgArray As Byte() = Encoding.[Default].GetBytes(msg)
Dim beforeendmsgArray As Byte() = Encoding.[Default].GetBytes(beforeendmsg)

f1.Write(msgArray, 0, msgArray.Length)
f1.Position = fStream.Lenght - 10
f1.Write(beforeendmsgArray, 0, msgAsByteArray.Length)


' view total message.
Dim totalLenght As Long = msgArray.Length + msgAsByteArray.Length
Dim filemsg As Byte() = New Byte(totalLenght - 1) {}
For i As Integer = 0 To totalLenght - 1
filemsg(i) = CByte(f1.ReadByte())
Next

التعامل مع الفئات المشتقة :

ذكرنا في أول دروسنا في هذا الموضوع ( راجع الدرس الأول ) أن لدينا عدة انواع من القراءة والكتابة في stream ذكرنا منها StreamWriter, StreamReader و StringWriter, StringReader و BinaryReader, BinaryWriter ، وهم ما سنبدأ في التعرف عليهم الآن .

StreamWriter, StreamReader :

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

StreamWriter :

Close() : اغلاق .
Flush() : مسح كافية محتويات ال buffer .
NewLine : سطر جديد .
Write() : كتابة عادية .
WriteLine() : كتابة مع سطر جديد .

StreamReader :

تحتوي بالاضافة إلى الدوال الثلاث الأولى في الفقرة السابقة :

Peek() قراءة الحرف التالي مباشرة للمكان الحالي دون تغيير مكان المؤشر.
Read() : القراءة .
ReadBlock() : قراءة مجموعة من الداتا ووضعها في ال buffer .
ReadLine() : قراءة سطر كامل .
ReadToEnd() : قراءة من مكان المؤشر حتى النهاية .

أمثلة :

مثال يجمع عمليتي القراءة والكتابة إلى ملف نصي :
C#:

private void write(

string msg)
{
using(StreamWriter w1 = File.CreateText("test.txt"))
{
w1.Write("Start");
w1.Write(writer.NewLine);
w1.WriteLine(msg);
}
}
private string read()
{
using (StreamReader s1 = File.OpenText("test.txt"))
{
string input = null;
string msg="";
while ((input = sr.ReadLine()) != null)
{
Console.WriteLine(input);
msg+=input;
}
return msg;
}
}

vb.net:

Private Sub write(ByVal msg As String)
Using w1 As StreamWriter = File.CreateText("test.txt")
w1.Write("Start")
w1.Write(writer.NewLine)
w1.WriteLine(msg)
End Using
End Sub
Private Function read() As String

Using s1 As StreamReader = File.OpenText("test.txt")
Dim input As String = Nothing
Dim msg As String = ""
While (input = sr.ReadLine()) IsNot Nothing
Console.WriteLine(input)
msg += input
End While
Return msg
End Using

End Function


ناتج عملية الكتابة في الملف :

http://vb4arab.com/vb/uploaded/3/01212631711.jpg

وناتج عملية القراءة على ال Console:

http://vb4arab.com/vb/uploaded/3/11212631711.jpg

*** لكن ناتج المتغير النصي سيكون بدون علامة السطر الجديد والذي سيكون ناتج عن الدالة ...

StringWriter, StringReader :

كما ذكرنا سابقاً لا يوجد اي فارق عما سبق ، فقط الناتج يعود في string وهو ما يمكنك من عملية بالشكل التالي مثلاً :
C#:


StringBuilder stbuilder = strWriter.GetStringBuilder();
stbuilder.Remove(0, 10);
stbuilder.Insert(0, "Ahmed Gamal");

vb.net:

Dim stbuilder As StringBuilder = strWriter.GetStringBuilder()
stbuilder.Remove(0, 10)
stbuilder.Insert(0, "Ahmed Gamal")

BinaryReader, BinaryWriter

تمكنك من الكتابة والقراءة والتخزين في ملفات binary ، مشتقة من الفئة System.Object وتحتوي على أغلب الدوال الموجودة في الاربع فئات السابقة . اضافة إلى الدالة ReadXXXX() حسب نوع المحتويات ، هذا المثال للقراءة والكتابة باستخدام هذه الفئة :

C#:

FileInfo f = new FileInfo("Binary.dat");
using(BinaryWriter bwriter = new BinaryWriter(f.OpenWrite()))
{
double dbl = 1234.67;
long lng = 34567000;
string str = "A, B, C";
// Write differnt data.
bwriter.Write(dbl);
bwriter.Write(lng);
bwriter.Write(str);
}

// Reading using ReadXXX;
using(BinaryReader breader = new BinaryReader(f.OpenRead()))
{
Console.WriteLine(breader.ReadDouble());
Console.WriteLine(breader.ReadInt64()); // == long as i think , i am not sure.
Console.WriteLine(breader.ReadString());
}


vb.net:

Dim f As New FileInfo("Binary.dat")
Using bwriter As New BinaryWriter(f.OpenWrite())
Dim dbl As Double = 1234.67
Dim lng As Long = 34567000
Dim str As String = "A, B, C"

' Write differnt data.
bwriter.Write(dbl)
bwriter.Write(lng)
bwriter.Write(str)
End Using

' Reading using ReadXXX;
Using breader As New BinaryReader(f.OpenRead())
Console.WriteLine(breader.ReadDouble())
Console.WriteLine(breader.ReadInt64())
' == long as i think , i am not sure.
Console.WriteLine(breader.ReadString())
End Using

إلى هنا نكون قد انتهينا من درس هذا اليوم ، بقي لدينا جزء واحد فقط في موضوع الملفات نستعرضه سوية غداً إن شاء الله .

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