Wednesday, April 11, 2007

Implementing Desing Patterns in File Handling using C#

نحوه استفاده از الگوهای طرّاحی در مدیریت فایل‌ها

کارکردن با فایل‌ها در زبان

نحوه استفاده از الگوهای طرّاحی در مدیریت فایل‌ها

کارکردن با فایل‌ها در زبان C#

کارکردن با فایل‌ها در زبان C# به دلیل استفاده از اشیای منعطف بسیار آسان است.

شی‌ء File

شی‌ء File یک فایل را نشان می‌دهد و دارای توابع بسیاری برای بررسی وجود یک فایل ، تغییر نامِ و پاک‌کردن یا حذف آن است. تمام توابع موجود در شی File ایستا[1] هستندکه در این‌صورت هرگز قادر به درست کردن یک شی یا نمونه[2] از کلاس File نخواهیم بود:

if (File.Exists ("Foo.txt"))

File.Delete ("foo.txt");

با استفاده از کلاسِ فایل حتی می‌شود از FileStream برای خواندن از یا نوشتن در فایل استفاده نمود:

//open text file for reading

StreamReader ts = File.OpenText ("foo1.txt");

//open any type of file for reading

FileStream fs = File.OpenRead ("foo2.any");

خواندن فایل‌های متنی

برای خواندن از فایل‌های متنی ، از شی File برای بدست‌آوردن یک شی از StreamReader استفاده نمائید:

StreamReader ts = File.OpenText ("foo1.txt");

String s =ts.ReadLine ();

نوشتن در فایل ِمتنی

برای نوشتن در فایلِ متنی از تابع CreateText برای دستیابی به شی‌ای از کلاس StreamWriter استفاده کنید.

//open for writing

StreamWriter sw = File.CreateText ("foo3.txt");

sw.WriteLine ("Hello file");

اگر مایل هستید که متنی را به فایل متنی‌تان بچسبانید می‌توانید مستقیماً یک شی از StreamWriter درست کنید و آرگومان بولی (بولیان)[3] آن را برابر True کنید.

//append to text file

StreamWriter asw = new StreamWriter ("foo1.txt", true);

استثنائات در مدیریت فایل‌ها

بیش‌تر استثنائات در ورودی و خروجی فایل رخ می‌دهد. استثتائاتی از قبیل این‌که فایلی را که وجود ندارد مورد استفاده قرار بگیرد و یا از آرگومان‌های نامناسب برای فایل استفاده شده باشد. بنابراین مطمئن‌ترین راه برای اجتناب از عواقب این استثنائات محصورسازی برنامه در بسته‌های Try و Catch است.

try {

//open text file for reading

StreamReader ts = File.OpenText ("foo1.txt");

String s =ts.ReadLine ();

}

catch(Exception e ) {

Console.WriteLine (e.Message );

}

بررسی پایان یک فایل

دو راه برای اینکه از خواندن اطلاعات بعد از پایان فایل جلوگیری شود ؛ وجود دارد. یکی به دنبال استثنای Null رفتن و دیگری به پایان data stream رسیدن است.

private StreamReader rf;

private bool eof;

//------------

public String readLine () {

String s = rf.ReadLine ();

if(s == null)

eof = true;

return s;

}

//------------

public bool fEof() {

return eof;

}

راه دیگر استفاده از Peek است که مقدار اَسکی[4] حرف بعدی را می‌خواند که مقدار 1- نبودن اطلاعات را می‌رساند.

public String read_Line() {

String s = ""

if (rf.Peek() > 0) {

s = rf.ReadLine ();

}

else

eof=true;

return s;

}

استفاده از کلاس‌های فایلینگ

یک راه مفید از مدیریت فایل‌ها استفاده از کلاس‌هایی با توابعی آسان است :

public class csFile

{

private string fileName;

StreamReader ts;

StreamWriter ws;

private bool opened, writeOpened;

//-----------

public csFile() {

init();

}

//-----------

private void init() {

opened = false;

writeOpened = false;

}

//-----------

public csFile(string file_name) {

fileName = file_name;

init();

}

با این کار می‌توان از یک فایل خواند یا در آن نوشت و اطلاعات موجود را در آن مدیریت کرد. می‌توان با استفاده از مقادیری بولی از باز یا بسته‌بودن یک فایل برای استفاده از آن استفاده کرد :

public bool OpenForRead(string file_name){

fileName = file_name;

try {

ts = new StreamReader (fileName);

opened=true;

}

catch(FileNotFoundException e) {

return false;

}

return true;

}

//-----------

public bool OpenForRead() {

return OpenForRead(fileName);

}

می‌توان اطلاعات را از یک فایل متنی خواند :

public string readLine() {

return ts.ReadLine ();

}

به همین ترتیب می‌توان از توابع زیر برای باز کردن یک فایل و نوشتن در آن استفاده نمود:

public void writeLine(string s) {

ws.WriteLine (s);

}

//-----------

public bool OpenForWrite() {

return OpenForWrite(fileName);

}

//-----------

public bool OpenForWrite(string file_name) {

try{

ws = new StreamWriter (file_name);

fileName = file_name;

writeOpened = true;

return true;

}

catch(FileNotFoundException e) {

return false;

}

}

منابع و مآخذ:

James W. Cooper , Introduction to Design Patterns in C# , IBM T J Watson Research Center , February 1, 2002



[1] Static

[2] instance

[3] Boolean

[4] ASCII


0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home