ایران سرفراز- نرم افزار وپروژهای دانشجویی


نرم افزار وپروژهای دانشجویی

فصل بیست و یکم کار با فایل هادر #C

<!-- /* Font Definitions */ @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman","serif"; mso-fareast-font-family:"Times New Roman";} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-size:10.0pt; mso-ansi-font-size:10.0pt; mso-bidi-font-size:10.0pt;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0; mso-gutter-direction:rtl;} div.Section1 {page:Section1;} -->

فصل بیست و یکم

C# در کار با فایل ها      

آنچه که در این فصل یاد خواهید گرفت:

کاوش ساختار فهرست، پیدا کردن فای لها و پوش ههای موجود و بررسی خصوصیات آنها

انتقال، کپی و حذف فای لها و پوش هها

خواندن و نوشتن متن در فایل ها

کنترل دسترسی به فایل ها

مایکروسافت مدل های شی زیادی برای پوشاندن این حوزه فراهم کرده اس ت . در این فصل نحو ه ی کاربرد کلا س های پایه

برای ان ج ام کارهای شرح شده در لیست قبلی را یاد م ی گیرید. کلاس های مرتبط با عملیات سیستم فایل تقریبا در NET.

هستند. System.IO فضای نامی

-1-21 مدیریت سیستم فایل

کلاس هایی که برای جستجوی سیستم فایل و انجام عملیاتی همچون انتقال، کپی کردن و حذف کردن فای ل ها هستند، در

1 نشان داده می شوند. فضای نامی هر کلاس در داخل [ ] در کنار نام کلاس نشان داده م یشود. - شکل 21

1- شکل 21

لیست زیر کار این کلا سها را شرح می دهد

mohsen_mahyar@yahoo.com - C# برنامه نویسی

364

است که از دور قابل کنترل هستند و مرت ب کردن 1 NET. کلاس پایه ی کلاس هایی از : System.MarshalByRefObject

داده های مابین دامنه های کاربردی را مجاز می دارد.

کلاس پایه که هر شی سیستم فایل را نشان می دهد. : FileSystemInfo

این کلا سها یک فایل را روی سیستم فایل نشان می دهند. :FileInfo و File

این کلا سها یک پوشه روی سیستم فایل را نشان می دهند. :DirectoryInfo,Directry

این کلاس اعضای ایستایی دارد که م یتوانند برای دستکاری اسامی مسیرها بکار روند. :Path

این کلاس مت دها و خصوصیاتی فراهم م یکند که اطلاعاتی درباره یک درایو منتخب فراهم م یکند :DriveInfo

NET. -1 کلاس های مربوط به پوشه ها و فایل ها در -1-21

در لیست قبلی دو کلاس برای نشان دادن یک پوشه و دو کلاس برای یک فایل استفاده م ی شدند. متناسب با تعداد دفعات

نیاز به دسترسی یک فایل یا پوشه، یکی از این دو نوع کلاس را بکار م یبرند.

فقط متدهای ایستا را در بر دارند و هرگز نمون ه ای از آن ایجاد نم ی شود. هر زمانی که یک مت  د عضو :File و Directory

این کلاس ها را فراخوانی م ی کنید، این کلا س ها را با تهی ه ی مسیر شی مناسب سیستم فایل به کار بری د . زمانیکه بخواهید فقط

یک عمل روی یک پوشه یا یک فایل انجام دهید، کاربرد این کلا س ها موثرتر است، چون آن سربار مربوط به ایجاد نمونه از

یک کلاس را صرف هجویی می کند.

را به همراه برخی از خصوصیات و File و Directory تقریبا همه متدهای عمومی :FileInfo, DirectoryIfo

پیاده سازی می کنند. اما آنها حالت شی را نشان م ی دهند و اعضای این کلاس ایستا نیستن د . قبل از public سازنده های

تخصیص یک فایل یا پوشه به این کلا س ها، باید نمو نه ای از این کلا س ها ایجاد کنی د . پس اگر م ی خواهید چندین عمل روی

یک شی انجام دهید این کلا س ها موثر هستن د . و چون آنها اطلاعات تصدیق را در هنگام ایجاد شی سیستم فایل می خوانند،

نیازی نیست مجدداَ این اطلاعات خوانده شده و بررسی گردن د . در مقایسه با کلا س های بدون ح الت، همه جزئیات باید قبل از

فراخوانی متدها کنترل گردد.

کار م ی کنید، اما برخی از متدهای فراخوانی شده با DirectoryInfo و FileInfo در این بخش اکثراَ با کلاس

پیاده سازی می شوند( اگرچه این متدها پارامتر اضافی نیاز دارند). مثال : File و Directory کلاس های

FileInfo myFile = new FileInfo(@"C:\Program Files\My Program\ReadMe.txt");

myFile.CopyTo(@"D:\Copies\ReadMe.txt");

کد زیر نیز همان تاثیر را دارد:

File.Copy(@"C:\Program Files\My Program\ReadMe.txt", @"D:\Copies\ReadMe.txt");

ایجاد کند و آن را برای انجام FileInfo تکه کد اول زمان بیشتری برای اجرا م ی گیرد. چون نیاز دارد یک نمونه از شی

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

DirectoryInfo یا FileInfo می توانید با ردکردن یک رشته شامل سیستم فایل مورد نظر به سازنده، نمون ه ای از کلا س

ایجاد کنید. کد مربوط به ایجاد پوشه به صورت زیر است:

DirectoryInfo myFolder = new DirectoryInfo(@"C:\Program Files");

اگر مسیر مورد نظر وجود نداشته باشد، یک استثنای زمان اجرا تولید نخواهد شد، مگر اینکه بخواهید یکی از متدهای این

می توان بود یا نبود یک پوشه و فایل را فهمید. Exists شی را فراخوانی کنید. با استفاده از خصوصیت

FileInfo test = new FileInfo(@"C:\Windows");

1 Marshaling

فصل بیست و یکم کار با فای لها

365

Console.WriteLine(test.Exists.ToString());

را اجرا کنید یک ()FileInfo.Open فایل نیست و اگر بخواهید متد c:\windows است، چون false خروجی کد قبلی

استثناء رخ می دهد.

بعد از اینکه تعیین کردید شی سیستم فایل موجود است، م ی توانید اطلاعاتی درباره آن با استفاده از خصوصیات جدول زیر

بیابید.

نام خصوصیت توصیف

زمان ایجاد فایل یا پوشه CreateTime

مسیر کامل پوشه ی فایل (FileInfo فقط در ) DirectoryName

فهرست پدر یک زیر فهرست مشخص (DirectoryInfo فقط در ) Parent

آیا فایل یا پوشه مورد نظر وجود دارد Exists

پسوند فایل را بر م ی گرداند، برای پوش ه ها رشته Extension

خالی بر می گردد.

نام مسیر کامل فایل یا پوشه FullName

زمان آخرین دسترسی به فایل یا پوشه LastAccessTime

زمان آخرین تغییر فایل یا پوشه LastWriteTime

نام فایل یا پوشه Name

بخش ریشه مسیر (DirectoryInfo فقط در ) Root

اندازه فایل بر حسب بایت (FileInfo فقط در ) Length

می توانید عملیاتی روی فایل با استفاده از متدهای جدول زیر انجام دهی د.

نام هدف

یک شی FileInfo یک پوشه یا فایل خالی با نام داده شده ایجاد م ی کند. در ()Create

بر می گرداند که به شما اجازه می دهد در فایل بنویسید. Stream

فایل یا پوشه را حذف م ی کند. در پوش ه ها یک گزینه برای حذف بازگشتی وجود ()Delete

دارد .

یک فایل یا پوشه را تغییر نام یا انتقال می دهد . ()MoveTo

فقط در ) ()CopyTo

(FileInfo

فایل را کپی م ی کند. هیچ متدی برای کپ ی کردن پوش ه ها وجود ندار د . باید

پوشه ها را ایجاد کرده و فای لها را یکی یکی کپی کنید.

فقط ) ()GetDirectories

(DirectoryInfo در

بر م ی گرداند که همه پوش ه های داخل این DirectoryInfo یک آرایه از اشیا ء

پوشه را نمایش م یدهد.

بر میگرداند که همه فای ل های داخل پوشه را FileInfo فقط در یک آرایه از اشیاء )()GetFiles

mohsen_mahyar@yahoo.com - C# برنامه نویسی

366

نشان می دهد. (DirectoryInfo

()GetFileSystemInfos

(irectoryInfo (فقط در

بر م ی گردان د که همه فای ل ها DirectoryInfo , FileInfo اشیاء

وپوشه های داخل این پوشه را نشان م یدهد.

توجه: این جدول خصوصیات و متدهای اصلی را لیست م یکند.

توجه داشته باشید که جداول قبلی بیشتر خصوصیات و متدهای مربوط به خواندن و نوشتن در فای ل ها را لیست نکرد ه اند .

و ()Create ،OpenWrite() ،OpenText() ،OpenRead() ،Open() تعدادی متد با عناوین FileInfo کلاس

را بر م ی گردانند. جالب اینکه زمان ایجاد،آخرین زمان دسترسی و Stream را پیاد ه سازی می کند که اشیاء ()CreateText

آخرین زمان تغییر قابل تغییر هستند.

// displays the creation time of a file,

// then changes it and displays it again

FileInfo test = new FileInfo(@"C:\MyFile.txt");

Console.WriteLine(test.Exists.ToString());

Console.WriteLine(test.CreationTime.ToString());

test.CreationTime = new DateTime(٢٠٠١, ١, ١, ٧, ٣٠, ٠);

Console.WriteLine(test.CreationTime.ToString());

اجرای این برنامه نتیج های شبیه زیر تولید م یکند.

True

۶/۵/٢٠٠۵ ٢:۵٩:٣٢ PM

١/١/٢٠٠١ ٧:٣٠:٠٠ AM

توانایی تغییر دستی این خصوصیات ابتدا خطرناک به نظر م ی رسد، اما آن م ی تواند خیلی مفید باش د . اگر برنامه ای دارید که

یک فایل را با خواندن آن و حذف کر د ن و ایجاد یک فایل جدید با محتویات جدید تغییر م ی دهد، شاید بخواهید تاریخ ایجاد

فایل را برای تطابق با تاریخ ایجاد فایل قدیمی اصلی تغییر دهید.

Path -2 کلاس -1-21

کلاسی نیست که بخواهید نمون ه ای از آن تعریف کنی د . در عوض، متدهای ایستایی دارد که عملیات روی اسامی ،Path کلاس

در Readme.txt مسیرها را ساد ه تر م ی سازد. مثال، فرض کنید م ی خواهید نام مسیر کامل یک فایل را نمایش دهی د . فایل

است. می توانید مسیر آن را با استفاده از کد زیر بدست آورید: c:\MyDocuments پوشه

Console.WriteLine(Path.Combine(@"C:\My Documents", "ReadMe.txt"));

از قال ب های Path بسیار ساد ه تر از بررسی سمب ل های جداسازی بصورت دستی است، چون کلاس ،Path کاربرد کلاس

Net. مختلف مسیرها در سیست م عامل های مختلف آگاه اس ت . در حال حاضر، ویندوز تنها سیست م عاملی است که توسط

وفق دهد. uinx قادر است خود را با مسیرهای Path ، جابجا شود uinx روی Net. پشتیبانی می شود. اگر

کنید و خصوصیات فایل ها را ببینید. browse بخش بعدی یک مثال ارائه م یدهد که نشان می دهد چگونه فهرست ها را

File Browser -3-1-21 مثال

ارائه م ی دهد که یک واسط کا ر بردی ساده دارد و م ی تواند FileProperties این بخش یک برنامه کاربردی ساده بنام

کرده و زمان ایجاد، زمان آخرین دسترسی، زمان آخرین تغییر و اندازه فایل را ببینید. Browse سیستم فایل را

فصل بیست و یکم کار با فای لها

367

کلیک Display روش کار برنامه بصورت زیر اس ت : نام فایل یا پوشه را در کادر متنی بالای پنجره تایپ کرده و روی دکمه

می شود. اگر مسیر ی ک فایل را تایپ کنید، جرئیات آن در کادرهای متنی پایین فرم نمایش داده م ی شود و محتویات پوشه در

را نشان می دهد. FileProperties 34 برنامه کاربردی - نمایش داده می شود. شکل 2 ListBox

34- شکل 2

Up کاربر با کلیک بر روی هر پوشه در لیست سمت راست، م ی تواند به پوش ه های داخ لی حرکت کند و با کلیک بر روی دکمه

را نشان می دهد. کاربر می تواند با کلیک بر روی نام My Dcumants 34 محتویات پوشه - به پوشه پدر حرکت کند. شکل 2

آن را انتخاب کن د . این عمل خصوصیات فایل را در کادرهای متنی پایین برنامه نشان م ی دهد. شکل 34 ،ListBox فایل در

3- را ببینید.

34- شکل 3

توجه : به دلخواه م یتوانید زمان ایجاد، زمان آخرین دسترسی، زمان آخرین تغییر پوش هها را با استفاده از خصوصیات

نشان دهید. DirectoeyInfo

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

368

2005 ایجاد کنید وکادرهای متنی و کادر لیست را از ناحیه کا د ر VS در Application Windows یک پروژه استاندارد

اضافه کنید و کنتر لها را به اسامی زیر تغییر نام دهید: Windows Forms ابزار

،listBoxFolders،listBoxFiles ،buttonUp ،buttonDisplay ،textBoxFolder ،textBoxInput

و textBoxLastWriteTime ،textBoxLastAccessTime،textBoxCreationTime ،textBoxFileName

textBoxFileSize

استفاده خواهید کرد. System.IO لازم است نشان دهید از فضای نامی

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.IO;

یک فیلد عضو به فرم اصلی اضافه کنید.

partial class Form١ : Form

{

private string currentFolderPath;

لازم است اداره کنند ههای رویداد را برای رویدادهای تولید شده توسط کاربر اضافه کنید. ورودی های ممکن کاربر عبارتند از:

کلیک می کند. Display • کاربر روی دکمه

کلیک می کند Files • کاربر روی نام فایل در فای لهای کادر لیست

کلیک می کند. Folders • کاربر روی نام یک پوشه در کادر لیست

کلیک می کند . Up • کاربر روی دکمه

محتویات همه کنتر ل های روی فرم را پاک م ی کند. چون خیلی از رویدادها باید قبل از انجام کار ()ClearAllFields متد

خود، همه کنترل ها را پاک کنند.

protected void ClearAllFields()

{

listBoxFolders.Items.Clear();

listBoxFiles.Items.Clear();

textBoxFolder.Text = "";

textBoxFileName.Text = "";

textBoxCreationTime.Text = "";

textBoxLastAccessTime.Text = "";

textBoxLastWriteTime.Text = "";

textBoxFileSize.Text = "";

}

پروسه ی نمایش اطلاعات یک فایل داده شده را در کادرهای متنی اداره م ی کند. این متد یک ()DisplayFileInfo متد

پارامتر می گیرد( مسیر کامل نام یک فایل را بصورت رشته می گیرد ).

protected void DisplayFileInfo(string fileFullName)

{

FileInfo theFile = new FileInfo(fileFullName);

if (!theFile.Exists)

throw new FileNotFoundException("File not found: " + fileFullName);

textBoxFileName.Text = theFile.Name;

textBoxCreationTime.Text = theFile.CreationTime.ToLongTimeString();

textBoxLastAccessTime.Text = theFile.LastAccessTime.ToLongDateString();

textBoxLastWriteTime.Text = theFile.LastWriteTime.ToLongDateString();

textBoxFileSize.Text = theFile.Length.ToString() + " bytes";

}

فصل بیست و یکم کار با فای لها

369

اگر مشکلی در پیداکردن یک فایل باشد، یک استثناء رخ م ی دهد که روال ف ر اخوانی کننده این متد، مسؤل کنترل این

محتویات یک پوشه را در دو کادر لیست نشان م ی دهد . مسیر ،()DisplayFolderList استثناء است . در نهایت، متد

کامل پوشه به عنوان پارامتر به این متد رد م یشود.

protected void DisplayFolderList(string folderFullName)

{

DirectoryInfo theFolder = new DirectoryInfo(folderFullName);

if (!theFolder.Exists)

throw new DirectoryNotFoundException("Folder not found: " + folderFullName);

ClearAllFields();

textBoxFolder.Text = theFolder.FullName;

currentFolderPath = theFolder.FullName;

// list all subfolders in folder

foreach(DirectoryInfo nextFolder in theFolder.GetDirectories())

listBoxFolders.Items.Add(nextFolder.Name);

// list all files in folder

foreach(FileInfo nextFile in theFolder.GetFiles())

listBoxFiles.Items.Add(nextFile.Name);

}

پیچیده ترین آنها اس ت . چون Display حال اداره کنند ه های رویدادها را بررسی کنی د . رویداد مربوط به کلیک روی دکمه

لازم است سه حالت ممکن برای متنی که کاربر در کادر متنی وارد کرده است را اداره کن د . برای مثال، ممکن است نام یک

فایل، مسیر کامل پوشه یا هیچکدام باشد.

protected void OnDisplayButtonClick(object sender, EventArgs e)

{

try

{

string folderPath = textBoxInput.Text;

DirectoryInfo theFolder = new DirectoryInfo(folderPath);

if (theFolder.Exists)

{

DisplayFolderList(theFolder.FullName);

return;

}

FileInfo theFile = new FileInfo(folderPath);

if (theFile.Exists)

{

DisplayFolderList(theFile.Directory.FullName);

int index = listBoxFiles.Items.IndexOf(theFile.Name);

listBoxFiles.SetSelected(index, true);

return;

}

throw new FileNotFoundException("There is no file or folder with "

+ "this name: " + textBoxInput.Text);

}

catch(Exception ex)

{

MessageBox.Show(ex.Message);

}

}

و خصوصیت FileInfo و DirectoryInfo در این کد، ابتدا به ازای متن تایپ شده توسط کاربر، به کمک نمون ه هایی از

فایل یا پوش ه بودن آن را بررسی م ی کند. اگر هیچکدام نبود، یک استثناء بروز م ی دهد. اگر فایل یا پوشه باشد، ،Exist

رویدادهایی را به ترتیب فراخوانی م یکند.

مربوط اس ت ( توسط کاربر یا از طریق برنامه نویسی Files کد زیر به اداره کنند ه ی رویداد انتخاب یک عضو در کادر لیست

رد می کند. ()DisplayFileInfo ). آن نام کامل فایل انتخابی را ایجاد کرده و به متد

protected void OnListBoxFilesSelected(object sender, EventArgs e)

{

mohsen_mahyar@yahoo.com - C# برنامه نویسی

370

try

{

string selectedString = listBoxFiles.SelectedItem.ToString();

string fullFileName = Path.Combine(currentFolderPath, selectedString);

DisplayFileInfo(fullFileName);

}

catch(Exception ex)

{

MessageBox.Show(ex.Message);

}

}

شبیه این اس ت . با این استثناء که متد Folders اداره کننده رویداد مربوط به انتخاب یک پوشه در کادر لیست

را برای بهنگام سازی محتوای کادرهای لیست فراخوانی م یکند. ()DisplayFolderList

protected void OnListBoxFoldersSelected(object sender, EventArgs e)

{

try

{

string selectedString = listBoxFolders.SelectedItem.ToString();

string fullPathName = Path.Combine(currentFolderPath, selectedString);

DisplayFolderList(fullPathName);

}

catch(Exception ex)

{

MessageBox.Show(ex.Message);

}

}

فراخوانی شود. به استثناء اینکه باید ()DisplayFolderList کلیک شود، باید متد up در نهایت، زمانیکه روی دکمه

انجام م ی شود FileInfo.DirectoryName مسیر کامل پوشه پدر را جهت نمایش بدست آوری د . این عمل با خصوصیت

که مسیر کامل پوشه پدر را بر م یگرداند.

protected void OnUpButtonClick(object sender, EventArgs e)

{

try

{

string folderPath = new FileInfo(currentFolderPath).DirectoryName;

DisplayFolderList(folderPath);

}

catch(Exception ex)

{

MessageBox.Show(ex.Message);

}

}

-2-21 انتقال، کپی و حذف فای لها

از کلا س های ()Delete ،MoveTo() همانطور که قبلا شرح داده شده، انتقال و حذف فای ل ها و پوش ه ها بوسیله متدها ی

و ()Move متدهای Directory و File انجام م ی شود. متدهای معادل آنها در کلاسهای DirectoryInfo و FileInfo

هستند . در مور د کاربرد این متدها کاملا هوشیار باشی د . این بخش کاربرد آنها را در موارد خاص با فراخوانی ()Delete

FileProperties ارائه م ی دهد. برای این کار مثال قبلی File از کلاس ()Delete و ()Copy ،Move() متدهای ایستای

بنامید . این مثال ویژگی اضافی دار د . هنگام نمایش خصوصیات FilePropertiesAndMovment را ایجاد کرده و آن را

یک فایل گزینه هایی برای حذف، انتقال یا کپی فایل به موقعیت دیگر م یدهد.

FilePeopertiesAndMovement -1 مثال -2-21

34 واسط کاربری برنامه جدید را نشان می دهد. - شکل 4

فصل بیست و یکم کار با فای لها

371

34- شکل 4

است . با استثناء اینکه سه دکمه و یک کادر FileProperyies همانطورکه می توانید ببینید، این برنامه در ظاهر شب ی ه

متنی در پایین پنجره اضافه شده اس ت . این کنترل ها فقط زمانی فعال هستند که خصوصیات یک فایل نمایش داده می شوند،

در بقیه حالات، غیر فعاال هستن د . زمانی که خصوصیات یک فایل منتخب نمایش داده م ی شوند،

بطور اتوماتیک مسیر کامل فایل را در کادر متنی پایین جهت ویرایش قرار م ی دهد . FilePropertiesAndMovment

کاربران برای انجام عملیات مناسب م ی توانند روی هر کدام از دکم ه ها کلیک کنند، که یک کادر پیام برای تایید عمل کاربر باز

34 را ببینید.) - می شود. ( شکل 5

34- شکل 5

کلیک کند، عمل شروع خواهد ش د . در بعضی مواقع، عمل انجام شده باعث ایجاد یک حالت Yes زمانیکه که کاربر روی

نادرستی می شود( مثلا تغییر نام یک پوشه یا یک فایل، حذف یک پوشه ). برای حل این مشکل، همه کنتر ل ها بعد از انجام

هر کاری دوباره مقدا ردهی می شوند.

FilePropertiesAndMovment -2 بررسی کد برنامه -2-21

اضافه FileProperties برای کدنویسی این پروسه، لازم است کنتر ل های مرتبط و اداره کننده های رویداد آنها را به کد

داده شده textBoxNewPath ،buttonMoveTo ،buttonCopyTo ،buttonDelete کنید. به کنترل های جدید اسامی

است.

فراخوانی می شود را ببینید: Delete ابتدا اداره کننده ی رویدادی که زمان کلیک کاربر روی دکمه

protected void OnDeleteButtonClick(object sender, EventArgs e)

{

try

mohsen_mahyar@yahoo.com - C# برنامه نویسی

372

{

string filePath = Path.Combine(currentFolderPath,

textBoxFileName.Text);

string query = "Really delete the file\n" + filePath + "?";

if (MessageBox.Show(query,

"Delete File?", MessageBoxButtons.YesNo) == DialogResult.Yes)

{

File.Delete(filePath);

DisplayFolderList(currentFolderPath);

}

}

catch(Exception ex)

{

MessageBox.Show("Unable to delete file. The following exception"

+ " occurred:\n" + ex.Message, "Failed");

}

}

به دلیل ریسک وقوع یک استثناء قرار داده م ی شود. برای مثال، شما جواز حذف فایل را نداشته try در کد این متد بلوک

باشید یا فایل توسط پروس ه ی دیگری منتقل شده است، ولی هنوز برنامه شما آن را نشان م ی دهد. مسیر فایل مورد نظر جهت

است . textBoxFileName بسازید که شامل پوش ه ی پدر و متن داخل کادر متنی CunentParentPath حذف را از فیلد

متدهای انتقال وکپی در روشی مشابه ساختاربندی می شوند .

protected void OnMoveButtonClick(object sender, EventArgs e)

{

try

{

string filePath = Path.Combine(currentFolderPath,

textBoxFileName.Text);

string query = "Really move the file\n" + filePath + "\nto "

+ textBoxNewPath.Text + "?";

if (MessageBox.Show(query,

"Move File?", MessageBoxButtons.YesNo) == DialogResult.Yes)

{

File.Move(filePath, textBoxNewPath.Text);

DisplayFolderList(currentFolderPath);

}

}

catch(Exception ex)

{

MessageBox.Show("Unable to move file. The following exception"

+ " occurred:\n" + ex.Message, "Failed");

}

}

protected void OnCopyButtonClick(object sender, EventArgs e)

{

try

{

string filePath = Path.Combine(currentFolderPath,

textBoxFileName.Text);

string query = "Really copy the file\n" + filePath + "\nto "

+ textBoxNewPath.Text + "?";

if (MessageBox.Show(query,

"Copy File?", MessageBoxButtons.YesNo) == DialogResult.Yes)

{

File.Copy(filePath, textBoxNewPath.Text);

DisplayFolderList(currentFolderPath);

}

}

catch(Exception ex)

{

MessageBox.Show("Unable to copy file. The following exception"

+ " occurred:\n" + ex.Message, "Failed");

}

فصل بیست و یکم کار با فای لها

373

}

هنوز کارتان کامل نشده است و لا ز م است مطمئن شوید کادر متنی و دکم ه های جدید در زما نهای مناسب فعال و غیرفعال

اضافه کنید. ()DisplayFileInfo می شوند. برای فعال کردن آنها در هنگام نمایش محتویات یک فایل، کد زیر را به

protected void DisplayFileInfo(string fileFullName)

{

FileInfo theFile = new FileInfo(fileFullName);

if (!theFile.Exists)

throw new FileNotFoundException("File not found: " + fileFullName);

textBoxFileName.Text = theFile.Name;

textBoxCreationTime.Text = theFile.CreationTime.ToLongTimeString();

textBoxLastAccessTime.Text = theFile.LastAccessTime.ToLongDateString();

textBoxLastWriteTime.Text = theFile.LastWriteTime.ToLongDateString();

textBoxFileSize.Text = theFile.Length.ToString() + " bytes";

// enable move, copy, delete buttons

textBoxNewPath.Text = theFile.FullName;

textBoxNewPath.Enabled = true;

buttonCopyTo.Enabled = true;

buttonDelete.Enabled = true;

buttonMoveTo.Enabled = true;

}

داده شود. DisplayFolderList لازم است یک تغییری در

protected void DisplayFolderList(string folderFullName)

{

DirectoryInfo theFolder = new DirectoryInfo(folderFullName);

if (!theFolder.Exists)

throw new DirectoryNotFoundException("Folder not found: " + folderFullName);

ClearAllFields();

DisableMoveFeatures();

textBoxFolder.Text = theFolder.FullName;

currentFolderPath = theFolder.FullName;

// list all subfolders in folder

foreach(DirectoryInfo nextFolder in theFolder.GetDirectories())

listBoxFolders.Items.Add(NextFolder.Name);

// list all files in folder

foreach(FileInfo nextFile in theFolder.GetFiles())

listBoxFiles.Items.Add(NextFile.Name);

}

یک تابع سودمند کوچک است که کنترل های جدید را غیرفعال م یکند. DisableMoveFeatures

void DisableMoveFeatures()

{

textBoxNewPath.Text = "";

textBoxNewPath.Enabled = false;

buttonCopyTo.Enabled = false;

buttonDelete.Enabled = false;

buttonMoveTo.Enabled = false;

}

اضافه کنید تا محتوای کادرهای متنی جدید را پاک کند. ()ClearAllFields لازم است کدی به متد

protected void ClearAllFields()

{

listBoxFolders.Items.Clear();

listBoxFiles.Items.Clear();

textBoxFolder.Text = "";

textBoxFileName.Text = "";

textBoxCreationTime.Text = "";

textBoxLastAccessTime.Text = "";

textBoxLastWriteTime.Text = "";

textBoxFileSize.Text = "";

textBoxNewPath.Text = "";

}

mohsen_mahyar@yahoo.com - C# برنامه نویسی

374

در حال حاضر کد کامل است.

-3-21 خواندن و نوشتن در فایل ها

انجام DirectoryInfo و FileInfo در اصل، خواندن و نوشتن در فای ل ها بسیار ساده اس ت . با این وجود، از طریق اشی ا ء

می توانید آن کار را انجام دهید. بعدا خواهیم دید File 2,0 از طریق کلاس Net . نمی شود. در عوض با استفاده از چارچوب

نیز می توان این کار را انجام داد. Stream که از طریق شی

-1 خواندن یک فایل -3-21

ایجاد کنید که یک کادر متنی و یک دکمه و یک کادر Windows Form برای مثال خواندن یک فایل، یک برنامه کاربردی

34 ظاهر گردد - متنی چند خطی داشته باشد. فرم شما باید شبیه شکل 6

34- شکل 6

مقصود این فرم آن است که ابتدا کاربر مسیر فایل مشخص را در کادر متنی وارد کرده و روی دکمه کلیک کن د . سپس برنامه

کاربردی محتوی فایل را خوانده و در کادر متنی چند خطی نمایش دهد. کد مثال بصورت زیر می باشد:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.IO;

namespace ReadingFiles

{

partial class Form١ : Form

{

public Form١()

{

InitializeComponent();

}

private void button١_Click(object sender, EventArgs e)

فصل بیست و یکم کار با فای لها

375

{

textBox٢.Text = File.ReadAll(textBox١.Text);

}

}

}

برای خواندن محتویات buttonl_Click در ا بتدای برنامه اضافه م ی گردد و رویداد System.IO در این مثال فضای نامی

محتویات فایل را م ی خواند. این متد ابتدا فایل را باز کرده و محتویات آن را خوانده و ()File.ReadAll فایل است و متد

34 را ببینید. - سپس فایل را می بندد. مقدار بازگشتی متد، رشته ای است که همه محتویات فایل را در بر دارد. شکل 7

34- شکل 7

بصورت زیر است. File.ReadAll در مثال قبلی نشانه ی متد

File.ReadAll(FilePath);

حالت دیگر این نشانه، نحو هی کدگذاری فایل را مشخص می کند.

File.ReadAll(FilePath, Encoding);

با استفاده از این گزینه ،م ی توان در حین خوا ندن فایل، نحو ه ی کدگذاری آن را مشخص کر د . پس می توانید چیزی شبیه این

انجام دهید:

File.ReadAll(textBox١.Text, Encoding.ASCII);

یک فایل باینری را باز کرده و محتویات آن را در یک آرای ه ی بایتی ReadAllBytes متدهای دیگری نیز وجود دار د . متد

می خواند. این متدها زیا د جالب نیستند، چون بیشتر هدف این است که فای ل ها خط به خط خوانده شون د . در این حالت،

استفاده کنید که این نوع عمل را مجاز م یدارد. ReadAllLines می توانید از متد

-2 نوشتن به یک فایل -3-21

2,0 بسیار ساده شده است، نوشتن در یک فایل نیز بسیار آسان اس ت . Net . همانند خواندن از فایل ها که توسط چارچوب

را برای خواندن داده فراهم ساخته است، برای ReadAllBytes و ReadAllLines ،ReadAll متدهای FCL همانطورکه

را فراهم کرده است. WriteAllLines و WriteAllBytes ،WriteAll نوشتن به یک فایل نیز متدهای

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

376

را بکار برید. اما کادر متنی چند خطی را برای Windows Forms به عنوان مثالی برای نوشتن به یک فایل، همان برنامه

بصورت زیر ظاهر خواهد شد . _Click1button واردکردن اطلاعات به یک فایل بکار برید. کد رویداد

private void button١_Click(object sender, EventArgs e)

{

File.WriteAll(textBox١.Text, textBox٢.Text);

}

را تایپ کرده و در کادر متنی دوم محتوای c:\Testing.txt برنامه را ایجاد کرده و اجرا کنید . در کادر متنی اولی

نگاه کنید، \:C تصادفی تایپ کنی د . سپس روی دکمه کلیک کنی د . هیچ چیز بصری اتفاق نخواهد افتا د . اما اگر به درایو ریشه

را با محتوای مشخص شده خواهید دید. Testing.txt فایل

در موقعیت مشخص شده، فایل متنی جدیدی ایجاد م ی کند و محتوای مورد نظر را در آن نوشته و WriteAll ابتدا متد

ذخیره می کند و سپس آن را م یبندد.

اگر برنامه را مجددا اجرا کنید و فایلی همنام با قبلی ولی با محتوی جدید ایجاد کنید، هیچ اتفاق خاصی نمی افتد و فایل قبلی

رونویسی می شود. مهم است توجه کنید که محتوی جدید به فایل اضافه نم ی شود، بلکه محتوی جدید بطور کامل محتوای

فایل ها ی موجود WriteAllLines و WriteAllBytes ،WriteAll قبلی را رونویسی م ی کند. در حقیقت، همه متدها ی

را رونویسی می کنند. پس هنگام استفاده از این متدها مواظب باشید.

نشانه زیر را بکار م یبرد. WriteAll در مثال قبلی متد

File.WriteAll(FilePath, Content)

می توان کدگذاری فایل جدید را مشخص کرد.

File.WriteAll(FilePath, Content, Encoding)

WriteAllLines به شما اجازه م ی دهد محتوای یک آرای ه ی بایتی را در یک فایل بنویسید و متد WriteAllBytes متد

به شما اجازه می دهد یک آرایه از رشت هها را به یک فایل بنویسید. برای مثال، کد زیر را در اداره کننده رویداد وارد کنید.

private void button١_Click(object sender, EventArgs e)

{

string[] movies ={"Grease","Close Encounters of the Third Kind","The Day After

Tomorrow"};

File.WriteAllLines("C:\Testing.txt", movies);

}

با محتوای زیر به شما خواهد داد. Testing.txt حال روی دکمه کلیک کنید. برنامه یک فایل

Grease

Close Encounters of the Third Kind

The Day After Tomorrow

هر عنصر از آرایه ی رشته ای را در یک سطر فایل متنی م ینویسد. WriteAllLines متد

-3 جریان ها -3-21

برای انتقال داده استفاده م ی شود. داده م ی تواند در یکی از دو Stream هدف جریان 1 از زما ن های گذشته بوده اس ت . شی

جهت انتقال داده شود.

اگر داده ها از یک منبع بیرونی به برنامه شما انتقال داده شود، آن را خواندن از جریان م یگویند.

اگر داده از برنامه شما به یک منبع بیرونی منتقل شود، آن را نوشتن به یک جریان م یگویند.

اغلب اوقات منبع بیرونی یک فایل است، اما ضرورتا اینطور نیست. حالت های ممکن دیگر عبارتند از:

1 Stream

فصل بیست و یکم کار با فای لها

377

خواندن و نوشتن روی شبکه با استفاده از پروتکل شبکه

( pipe ) • خواندن و نوشتن به یک لوله نا مگذاری شده

خواندن و نوشتن فضایی از حافظه

تهیه کرده اس ت . System.IO.MemoryStream برای نوشتن و خواندن از حافظه بنام Net. مایکروسافت یک کلاس پای ه ی

داده شبکه را اداره می کند. کلاس پایه جریان برای خواندن و System.Net.Sockets. NetworkStream کلاس

یک کلاس برای آن ایجاد کنی د . جریان هیچ Stream نوشتن در لول ه ها وجود ندارد، ولی م ی توانید با ار ث بری از کلاس کلی

فرضی درباره طبیعت منبع خارجی در نظر نم یگیرد.

منبع خارجی م ی تواند یک متغیر در داخل ک د خودتان باش د . این پارادوکس است، اما تکنیک کاربرد جریا ن ها برای انتقال

شبیه این را برای تبدیل انواع داد ه ای صحیح c داده مابین متغیرها، م ی تواند در هنگام تبدیل انواع داد ه ای مفید باش د . زبان

و رشته ها یا قال ببندی رشته ها بکار می برد.

این است که با DirectoryInfo یا FileInfo مزیت وجود یک شی مجزا برای انتقال داده به جای استفاده از کلا س های

StringWriter, متمایز کردن انتقال داده از منبع داده خاص، جابجا کردن منابع داده بسیار آسان اس ت . کلاس های

بخشی از همان درخت وارثت هستند که بعدا برای خواندن یا نو ش تن در فای ل های متنی با عنوان کلا سهای StringReader

استفاده خواهند شد. StreamWriter,StreamReader

نشان می دهد. System.IO 34 سلسه مراتب واقعی کلا سهای مرتبط با جریان را در فضای نامی - شکل 8

34- شکل 8

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

این کلاس قصد دارد داد ه های دودویی را در یک فایل دودویی خوانده یا بنویسی د . با این وجود م ی توانید آن :FileStream

را برای خواندن یا نوشتن هر فایلی بکار برید.

این کلا سها مخصوصا برای خواندن و نوشتن فایل های متنی طراحی شده اند. :StreamWriter,StreamReader

در مثا ل های ما استفاده نم ی شوند، آنها نیز م ی توانند مفید باشی د . در BinaryWriter,BinaryReader اگرچه کلاس های

واقع این کلا س ها جریا ن ها را پیاد ه سازی نمی کنند، اما قادر هستند بست ه بندی اشیاء دیگر جریان را فراهم کنن د . کلاس های

دستورات قال ب بندی اضافی برای داد ه های دودویی را فراهم م ی کنند، که به شما اجازه BinaryWriter,BinryReader

34 را ببینید. - را به جریان مرتبط نوشته یا از آن بخوانی د. شکل 9 #c می دهد محتوی متغیرهای

34- شکل 9

mohsen_mahyar@yahoo.com - C# برنامه نویسی

378

تفاوت مابین کاربرد این کلاس ها یا کاربرد اشیاء جریان اصلی این است که اشیاء جریان پایه با بای تها کار می کنند. برای

را در یک فایل باینری بنویسید. اگر بخواهید از کلاس جریان معمولی Long مثال: فرض کنید م یخواهید یک متغیر از نوع

BinaryWriter از کلاس Write استفاده کنید، باید هر هشت بایت را بطور صریح در آن بنویسید، ولی با استفاده از متد

می توان این متغیر را یکجا به عنوان پارامتر به آن ارسال کرد تا در فایل باینری نوشته شود و بطور مشابه متد

می ریزد. Long 8 بایت از جریان استخراج کرده ودر متغیر از نوع ،BinaryReader.Read()

-4 جریان های بافر شده -3-21

به دلیل بهر ه روی، خروجی د ر زمان خواندن و یا نوشتن فایل، بافر م ی شود. بدین معنی که اگر برنام ه ی شما بخواهد دوبایت

بعدی یک جریان فایل را بخواند، جریان مربوطه درخواست خود را به سیست م عامل رد م ی کند. سپس سیستم عامل به جای

اینکه محل فایل را پیدا کرده و آن را جهت خواندن باز کن د . بلوک بزر گی از داد ه ها را از روی دیسک به ناحیه خاصی از

حافظه بنام بافر بازیابی م ی کند. در دستورهای خواندن و نوشتن بعدی، به جای ارجاع مستقیم به فایل روی دیسک از این

بافر استفاده خواهد کرد.

-5 خواندن و نوشتن در فایل های دودویی -3-21

انجام شود. FileStream خواندن و نوشتن در فای لهای دودویی می تواند از طریق کلاس

FileStream کلاس

برای خواندن یا نوشتن در فای ل ها استفاده م ی شود . به منظور ایجاد یک شی FileStream یک نمونه از کلاس

چهار تکه اطلاعات لازم دارید. ،FileStream

فایلی که می خواهید به آن دسترسی کنید. : File •

شیوه ی بازکردن فایل را مشخص م ی کند. برای مثال، آیا شما قصد دارید یک فایل جدید ایجاد کنید یا فایل : Mode •

موجود را باز کنید؟ و اگر فایل موجود را باز کردید قصد دارید اطلاعات آن رونویسی شوند یا اطلاعات جدید به آن

اضافه گردند ؟

نحوه ی دسترسی شما به فایل را مشخص م ی کند. برای مثال م ی خواهید یک فایل را بخوانید یا بنویسید : Access •

یا هردو کار را انجام دهید.

مشخص می کند دسترسی به این فایل منحصر است یا اجاره م ی دهید بطور همزمان جریان های دیگر نیز : Share •

به این فایل دسترسی داشته باشند و اینکه دسترسی جریا نهای دیگر خواندن و نوشتن یا هر دو می تواند باشد.

Net. بخش اول اطلاعات رشت ه ای است که نام و مسیر کامل فایل را شامل اس ت . سه بخش باقیمانده بوسیله انواع شمارشی

نمایش داده می شوند. مقادیر این انواع شمارشی در جدول زیر FileMode , FileShare,FileAccess بنام های

لیست می شوند .آنها بیانگر کارخود هستند.

نوع شمارشی مقادیر

Append-Create-CreateNew-Open-OpenorCreate- FileMode

Truncate

Read-ReadWrite-Write FileAccess

فصل بیست و یکم کار با فای لها

379

Inheritable-None-Read-ReadWrite-Write FileShare

و Open ،Append ، اگر مد یک فایل با حالت آن ناسازگار باشد، استثنا ء هایی روی م ی دهد. اگر فایل وجود نداشته باشد

به یک استثناء منجر م ی شود . انواع شمارشی CreateNew ، استثناء تولید م ی کنند و اگر فایل موجود باشد Truncate

ترکیب کنید. (|) or بیتی هستند و م یتوانید مقادیر آنها را با عملگر بیتی FileShare,FileAccess

چندین سازنده دارد. سه سازنده ی ساده آن بصورت زیر کار م یکنند: FileStream

// creates file with read-write access and allows other streams read access

FileStream fs = new FileStream(@"C:\C# Projects\Project.doc",

FileMode.Create);

// as above, but we only get write access to the file

FileStream fs٢ = new FileStream(@"C:\C# Projects\Project٢.doc",

FileMode.Create, FileAccess.Write);

// as above but other streams don't get

// fs٣ is open

FileStream fs٣ = new FileStream(@"C:\C# Projects\Project٣.doc",

FileMode.Create, FileAccess.Write, FileShare.None);

های این سازند ه ها روی مقادیر پی ش فرض پارامتر سوم و چهارم تاثیر overload ، همانطور که این کد نشان م ی دهد

FileInfo ایجاد یک جریان فایل از یک نمونه .(FileShare.Read ,FileAccess.ReadWrite) می گذارند

امکان پذیر است.

FileInfo myFile۴ = new FileInfo(@"C:\C# Projects\Project۴.doc");

FileStream fs۴ = myFile۴.OpenRead();

FileInfo myFile۵= new FileInfo(@"C:\C# Projects\Project۵doc");

FileStream fs۵ = myFile۵.OpenWrite();

FileInfo myFile۶= new FileInfo(@"C:\C# Projects\Project۶doc");

FileStream fs۶ = myFile۶.Open(FileMode.Append, FileAccess.Write,

FileShare.None);

FileInfo myFile٧ = new FileInfo(@"C:\C# Projects\Project٧.doc");

FileStream fs٧ = myFile٧.Create();

یک جریان با دسترسی فقط خواندنی به یک فایل موجود تهیه م ی کند. در حالی که متد ()FileInfo.OpenRead متد

پارامترهای مد، حالت و ()FileInfo.Open دسترسی خواندن و نوشتن به شما م ی دهد. متد FileInfo.OpenWrite

اشتراک را بطور صریح م یخواهد. البته بعد از استفاده یک جریان، باید آن را ببندید.

fs.Close();

بستن یک جریان، منابع تخصیص یافته به آن را آزاد م ی کند و به برنام ه های دیگر اجازه م ی دهد تا جریا ن های دیگر را روی

همان فایل تنظیم کنن د . در بین باز کردن تا بستن جریان، شما داد ه هایی را روی فایل نوشته یا از آن خواهید خوان د .

چند متد برای انجام اینکار پیاده سازی می کند. FileStream

ساده ترین راه خ و اندن داده اس ت . آن یک بایت از جریان را م ی گیرد و نتیجه را به یک مقدار صحیح مابین 0 ReadByte متد

تا 255 قالب بندی می کند. اگر به انتهای جریان رسیده باشد، مقدار 1- بر می گرداند.

int NextByte = fs.ReadByte();

را فراخوانی کنی د . تعداد معینی بایت را خوانده و Read اگر قصد دارید در یک لحظه چندین بایت را بخوانید، م ی توانید متد

تعداد بای ت های واقعا خوانده شده را بر م ی گرداند. اگر مقدار صفر برگرداند، در انتهای ()Read در یک آرایه قرار م ی دهد. متد

قرار می دهد. ByteArray جریان هستید. دستور زیر داده ها را خوانده و در یک آرای هی بایتی به نام

int nBytesRead = fs.Read(ByteArray, ٠, nBytes);

پارامتر دوم یک آفست است که محل شروع پرکردن خان ه های آرایه را مشخص م ی کند و پارامتر سوم تعداد بای ت ها جهت

خواندن است.

mohsen_mahyar@yahoo.com - C# برنامه نویسی

380

یک بایت ()WriteByte متد .()Write و ()WriteByte: اگر بخواهید داده ها را در یک فایل بنویسید، دو متد وجود دار د

را به جریان م ینویسد.

byte NextByte = ١٠٠;

fs.WriteByte(NextByte);

با مقادیر خاص مقداردهی ByteArray یک آرایه از بای ت ها را م ی نویسد. برای مثال، اگر آرایه Write از طرفی دیگر، متد

اول آن به فایل بکار برید: nByte اولیه شده باشد، می توانیم کد زیر را برای نوشتن

fs.Write(ByteArray, ٠, nBytes);

-6 خواندن ونوشتن در فای لهای متنی -3-21

StreamReader کلاس

خیلی ساد هتر از ایجاد StreamReader برای خواندن فای ل های متنی استفاده م ی شود. ایجاد یک نمونه StreamReader

لازم نیس ت . نیازی نیست نوع دسترسی و مد فایل FileStream است، چون بعضی ا ز گزینه های FileStream یک نمونه

مشخص گردد، چون به طور پی شفرض مشخص است.

لازم است متدهای کد گذاری مختلف را بدانید تا در آغاز کار با فایل نوع کدگذاری را مشخص کنید.

می توانید به جای تهیه نام فایل، ارجاعی به یک جریان دیگر تهیه کنید.

تعداد StreamReader ، می تواند برای خواندن و پردازش داده از هر نوع منبع بکار بر د . نتیجه اینکه StreamReader

یک ارجاع ()OpenText و ()CreateText همچون FileInfo زیادی سازنده دارد و مجموعه ای از متدهای

به صورت زیر هستند: StreamReader برمی گرداند. چند تا از سازند ههای StreamReader

StreamReader sr = new StreamReader(@"C:\My Documents\ReadMe.txt");

StreamReader sr = new StreamReader(@"C:\My Documents\ReadMe.txt",Encoding.UTF٨);

است FileStream یک نمونه از fs با فرض اینکه

FileStream fs = new FileStream(@"C:\My Documents\ReadMe.txt",

FileMode.Open, FileAccess.Read, FileShare.None);

StreamReader sr = new StreamReader(fs);

باشد FileInfo یک نمونه از myfile درصورتی که

FileInfo myFile = new FileInfo(@"C:\My Documents\ReadMe.txt");

StreamReader sr = myFile.OpenText();

آن را ببندید. StreamReader بعد از استفاده FileStream مانند

StreamReader متدهای کلاس

خط جاری را تا انتها خوانده و در یک رشته بر م یگردد. :()ReadLine

string nextLine = sr.ReadLine();

از محل جاری تا انتهای فایل را خوانده و در یک رشته بر می گرداند. :()ReadToEnd

string restOfStream = sr.ReadToEnd();

می تواند برای خواندن یک یا چند کاراکتر استفاده شود . :()Read

int nextChar = sr.Read();

// to read ١٠٠ characters in.

int nChars = ١٠٠;

char [] charArray = new char[nChars];

int nCharsRead = sr.Read(charArray, ٠, nChars);

فصل بیست و یکم کار با فای لها

381

تعداد کارکترهای واقعا خوانده شده است. nCharRread تعداد کارکترهای درخواستی است و nChars

StreamWriter کلاس

کار م ی کند. به استثناء اینکه، فقط م ی توانید برای نوشتن یک فایل بکار بری د .حالتهای ممکن StreamReader اساسا همانند

به صورت زیر هستند. StreamWriter سازنده ی

StreamWriter sw = new StreamWriter(@"C:\My Documents\ReadMe.txt");

8 است . اگر بخواهید نحو ه ی کدگذاری را مشخص کنید، م ی توانید از سازند ه ی زیر UTF نحوه ی کدگذاری بطور پی ش فرض

استفاده کنید. پارامتر دوم می گوید: آیا فایل برای اضافه کردن داده ها باز شود یا نه.

StreamWriter sw = new StreamWriter(@"C:\My Documents\ReadMe.txt", true,

Encoding.ASCII);

باشد: FileStream یک نمونه از fs در صورتیکه

FileStream fs = new FileStream(@"C:\My Documents\ReadMe.txt",FileMode.CreateNew,

;(FileAccess.Write, FileShare.Read

;(StreamWriter sw = new StreamWriter(fs

باشد: FileInfo نمونه ای از myFile اگر

FileInfo myFile = new FileInfo(@"C:\My Documents\NewFile.txt");

StreamWriter sw = myFile.CreateText();

باید آن را ببندید. ،StreamWriter همانند دیگر کلاس های جریان، بعد از استفاده

StreamWriter متدهای کلاس

با استفاده از این متد می توانید یک کارکتر یا یک رشته یا یک آرایه کارکتری را به جریان بنویسید. :()Write متد

string nextLine = "Groovy Line";

sw.Write(nextLine);

char nextChar = 'a';

sw.Write(nextChar);

char [] charArray = new char[١٠٠];

// initialize these characters

sw.Write(charArray);

می توانید بخشی از یک آرایه کاراکتری را در جریان بنویسید.

int nCharsToWrite = ۵٠;

int startAtLocation = ٢۵;

char [] charArray = new char[١٠٠];

// initialize these characters

sw.Write(charArray, startAtLocation, nCharsToWrite);

CryptoStream -7 رمزنگاری با کلاس -3-21

-4-21 خواندن اطلاعات درایو

2,0 توانایی خواندن اطلاعات یک درایو خاص را معرفی م یکند . این با Net . علاوه بر کار با فای لها و فهرس تها، چارچوب

می تواند سیستم را جهت بدست آوردن درایوهای آن DriveInfo انجام م ی شود. کلاس DriveInfo استفاده از کلاس

پویش کند و سپس اطلاعات دقیق در مورد هر درایو را در اختیار شما قرار دهد.

.(10- ساده دارد(همانند شکل 21 ListBox ساده ایجاد کنید که یک Windows Form مثال: یک برنامه

mohsen_mahyar@yahoo.com - C# برنامه نویسی

382

10- شکل 21

بعد از تنظیم فرم، کد دو رویداد (رویداد بارگذاری فرم و رویداد انتخاب از لیست ) را اضافه کنی د . کد شما بصورت زیر نمایش

داده خواهد شد.

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.IO;

namespace DriveInfo

{

partial class Form١ : Form

{

public Form١()

{

InitializeComponent();

}

private void Form١_Load(object sender, EventArgs e)

{

DriveInfo[] di = DriveInfo.GetDrives();

foreach (DriveInfo itemDrive in di)

{

listBox١.Items.Add(itemDrive.Name);

}

}

private void listBox١_SelectedIndexChanged(object sender, EventArgs e)

{

DriveInfo di = new DriveInfo(listBox١.SelectedItem.ToString());

MessageBox.Show("Available Free Space: " + di.AvailableFreeSpace + "\n"

+

"Drive Format: " + di.DriveFormat + "\n" +

"Drive Type: " + di.DriveType + "\n" +

"Is Ready: " + di.IsReady.ToString() + "\n" +

"Name: " + di.Name + "\n" +

"Root Directory: " + di.RootDirectory + "\n" +

"ToString() Value: " + di.ToString() + "\n" +

"Total Free Space: " + di.TotalFreeSpace + "\n" +

"Total Size: " + di.TotalSize + "\n" +

"Volume Label: " + di.VolumeLabel.ToString(), di.Name +

" DRIVE INFO");

}

}

}

یک لیست DriveInfo با استفاده از کلاس _Load1Form است . در رویداد System.IO اولین مرحله معرفی فضای نامی

انجام م ی شود، ()DriveInfo.GetDrives از همه ی درایوهای موجود روی سیستم تهیه کنی د . این عمل با استفاده از متد

فصل بیست و یکم کار با فای لها

383

ListBox می توانید آنها را یافته و به foreach بر م ی گرداند و با استفاده از حلق ه ی DriveInfo که یک آرایه از اشیاء

11 تولید می کند. - اضافه کنید. این کار چیزی شبیه شکل 21

11- شکل 21

این فرم به کاربر اجازه م ی دهد یکی از درایوهای لیست را انتخاب کن د . زمانیکه انتخاب انجام شد، یک کادر پیام که شامل

جزئیات درایو انتخاب شده است نمایش داده م یشود.

-5-21 امنیت فایل

های فایل ها، فهرست ها نبود . بنابراین ACL 1,1/1,0 اولین بار معرفی شد. هیچ روش ساده برای کار با Net . زمانیکه چارچوب

ها را با یک ACL 2,0 کار با Net . ها به این عمل دسترسی داشت. در حال حاضر نسخه COM لازم بود با کدنویسی پیچید هی

ساده تر کرده اس ت . با این فضای ن  امی جدید، دستکاری System.Security.AccessControl فضای نامی جدید

و غیره امکان پذیر Active Directory تنظیمات امنیت فای لها، فهرست ها، کلیدهای ریجستری، اشتراک شبکه، اشیاء

است.

های یک فایل ACL -1-5-21 خواندن

یک فای ل خاص را نشان ACL با یک مثال ساده این مطلب را ارائه م ی کنیم. برنامه ی زیر یک برنامه کنسولی است که اطلاعات

می دهد.

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

using System.Security.AccessControl;

namespace ConsoleApplication١

{

class Program

{

static string myFilePath;

static void Main(string[] args)

{

Console.Write("Provide full file path: ");

myFilePath = Console.ReadLine();

try

{

using (FileStream myFile = new FileStream(myFilePath,

FileMode.Open, FileAccess.Read))

{

FileSecurity fileSec = myFile.GetAccessControl();

foreach (FileSystemAccessRule fileRule in

fileSec.GetAccessRules(true, true,

typeof(System.Security.Principal.NTAccount)))

{

mohsen_mahyar@yahoo.com - C# برنامه نویسی

384

Console.WriteLine("{٠} {١} {٢} access for {٣}", myFilePath,

fileRule.AccessControlType == AccessControlType.Allow ?

"provides" : "denies",

fileRule.FileSystemRights,

fileRule.IdentityReference.ToString());

}

}

}

catch

{

Console.WriteLine("Incorrect file path given!");

}

Console.ReadLine();

}

}

}

اس ت . این عمل دسترسی به کلاسهای System.Security.AccessControl اولین مرحله ارجاع به فضای نامی

FileStream ر ا به شما خواهد دا د . بعد از اینکه فایل خاص در یک شی FileSystemAccessRule و FileSecurity

بدست م ی آید. این اطلاعات در یک کلاس File روی شی ()GetAccessControl های فایل از طریق متد ACL . قرار گرفت

قرار م یگیرند. این کلاس قوانین دسترسی را در بر دارد. هر قانون دسترسی با یک شی FileSecurity

نمایش داده می شود. این مثال را اجرا کرده وخروجی آ ن را مشاهده کنید. FileSystemAccessRule

استفاده کنید DirectoryInfo از FileStream های یک فهرست شبیه فایل است. فقط به جای شی ACL خواندن

های یک فایل ACL -2-5-21 اضافه کردن و حذف

های یک منبع با استفاده از اشیاء استفاده شده در مثا ل های قبلی امکا ن پذیر است . کد زیر مثال قبلی خواندن ACL دستکاری

های یک فایل خاص خوانده شده، تغییر یافته و مجددا خوانده م یشود. ACL های یک فایل را تغییر می دهد. در این مثال ACL

try

{

using (FileStream myFile = new FileStream(myFilePath,

FileMode.Open, FileAccess.ReadWrite))

{

FileSecurity fileSec = myFile.GetAccessControl();

Console.WriteLine("ACL list before modification:");

foreach (FileSystemAccessRule fileRule in

fileSec.GetAccessRules(true, true,

typeof(System.Security.Principal.NTAccount)))

{

Console.WriteLine("{٠} {١} {٢} access for {٣}", myFilePath,

fileRule.AccessControlType == AccessControlType.Allow ?

"provides" : "denies",

fileRule.FileSystemRights,

fileRule.IdentityReference.ToString());

}

Console.WriteLine();

Console.WriteLine("ACL list after modification:");

FileSystemAccessRule newRule = new FileSystemAccessRule(

new System.Security.Principal.NTAccount(@"PUSHKIN\Tuija"),

FileSystemRights.FullControl,

AccessControlType.Allow);

fileSec.AddAccessRule(newRule);

File.SetAccessControl(myFilePath, fileSec);

foreach (FileSystemAccessRule fileRule in

fileSec.GetAccessRules(true, true,

typeof(System.Security.Principal.NTAccount)))

{

فصل بیست و یکم کار با فای لها

385

Console.WriteLine("{٠} {١} {٢} access for {٣}", myFilePath,

fileRule.AccessControlType == AccessControlType.Allow ?

"provides" : "denies",

fileRule.FileSystemRights,

fileRule.IdentityReference.ToString());

}

}

}

فایل اضافه م ی شود. این عمل با استفاده از شی ACL در این مثال یک قانون دسترسی جدید به

جدی  د ایجاد شده و دسترسی NTAccount انجام م ی شود. در اینجا یک نمونه از شی FileSystemAccessRule

برای تخصیص قانون FileSecurity کلاس AddAccessRule این فایل به آن داده م ی شود. سپس متد FullControl

را به یک فایل تخصیص FileSecurity یک نمونه File از شی SetAccessControl جدید استفاده م ی شود. متد

می دهد.

خروجی برنامه ی بالا را بررسی کنید.

کافی است در کد قبلی تغییر زیر را انجام دهید. به جای دستور ،ACL برای حذف یک قانون از لیست

fileSec.AddAccessRule(newRule);

کد زیر را بنویسید:

fileSec.RemoveAccessRule(newRule);

-6-21 خلاصه

هستند. System.IO − کلاس های مرتبط با عملیات سیستم فایل تقریبا در فضای نامی

فقط متدهای ایستا را در بر دارند و هرگز نمون های از آن ایجاد نمی شود File و Directory − کلاس های

()Create ،OpenWrite() ،OpenText() ،OpenRead() ،Open() تعدادی متد با عناوین FileInfo − کلاس

را بر می گردانند. Stream را پیاد هسازی می کند که اشیاء ()CreateText و

عملیات روی اسامی مسیرها را ساد هتر می سازد. Path − کلاس

و FileInfo از کلا سهای ()Delete ،MoveTo() − انتقال و حذف فای لها و پوشه ها بوسیله متدهای

انجام می شود. DirectoryInfo

محتویات فایل را م یخواند. ()File.ReadAll − و متد

در موقعیت مشخص شده، فایل متنی جدیدی ایجاد می کند و محتوای مورد نظر را در آن WriteAll − ابتدا متد

نوشته و ذخیره می کند و سپس آن را م یبندد.

برای انتقال داده استفاده می شود. داده می تواند در یکی از دو جهت انتقال داده شود. Stream − شی

انجام شود. FileStream − خواندن و نوشتن در فایل های دودویی می تواند از طریق کلاس

برای خواندن فایل های متنی استفاده می شود StreamReader −

می تواند سیستم را جهت بدست آوردن درایوهای آن پویش کند و سپس اطلاعات دقیق در DriveInfo − کلاس

مورد هر درایو را در اختیار شما قرار دهد.

mohsen_mahyar@yahoo.com - C# برنامه نویسی

386

ها را با یک فضای نامی جدید ACL 2,0 کار با Net . − در حال حاضر نسخه

ساده تر کرده است. System.Security.AccessControl

 

mohsen_mahyar@yahoo.com - C# برنامه نویسی

 

   + MOHSEN GHASEMI - ۸:٥٢ ‎ب.ظ ; ۱۳۸٩/٤/٢٩