برنامه نویسی به زبان سی شارپ

محمد پرنده

عضو جدید
آموزش سی شارپ - کار کردن با فایل ها

شاید برای خیلی از شما دوستان پیش آمده باشه که بخواهید اطلاعات مورد نظرتون را داخل فایل ها ذخیره و یا از فایلی بازیابی کنید. در این جلسه از آموزش می خواهم یک مثال در رابطه با کار با فایل ها در سی شارپ بنویسم.در دات نت یک namespace به نام System.IO وجود داره که داخلش کلی کلاس مختلف برای کارکردن با فایل ها وجود دارد. ابتدا اجازه بدین در رابطه با مفهومی به نام Stream توضیح بدم. Stream در واقع به یک سلسله از بایت ها اشاره میشه. حالا شما می تونید خودتون یک Stream ایجاد کنید و یا اینکه از Stream های بوجود آمده توسط دیگران استفاده کنید. در System.IO یک کلاس abstract به نام Stream وجود دارد که کلاس های زیر از آن به ارث رفته اند. نکته مشترک بین این کلاس ها این است که تمامی آن ها در واقع مجموعه ای از بایت های کنار هم هستند که می توانند حاوی اطلاعات باشند. شکل زیر چند کلاس که از کلاس Stream به ارث رفته اند را نمایش می دهد:
FileStream: همانطور که از اسمش برمی آید این کلاس به سلسله بایت های کنار هم در که یک فایل قراردارند اشاره می کند. در این کلاس متد ها و خصوصیاتی وجود دارند که به شما کمک می کنند که با فایل ها کار کنید ، اطلاعات بخوانید ، بنویسید و ...NetworkStream: این کلاس هم یک مدل Stream است که در شبکه تبادل می شه و متناسب با نیازمندی های شبکه متد ها و خصوصیات خاص خود را دارد.MemoryStream: این کلاس هم به شما امکان می ده تا یک سری اطلاعات را در حافظه نگهداری کنید. معمولا وقتی می خواهیم که یک Stream تولید بشه ولی نمی خواهیم که روی شبکه و یا فایل ذخیره بشه از این کلاس استفاده می کنیم.برای اینکه این مفاهیم را بهتر درک کنیم می خواهم یک مثال ایجاد کنم که با فایل های متنی کار می کنه. حتما همه شما نرم افزار notepad ویندوز را دیدید. مثال ما هم شبیه به notepad خواهد بود. برای اینکار از یک پروژه نوع ویندوز استفاده می کنم و در داخل فرم اصلی نرم افزارم یک TextBox قرار می دهم. خصوصیت Multiline را به true ست می کنم و خصوصیت Dock را Fill تنظیم می نمایم و در نهایت اسم کنترل را به txtContent ست می کنم. سپس یک منوی اصلی با عنوان "پرونده" و چهار زیر منو با عناوین "جدید" ، "باز کردن" , "ذخیره" و در نهایت "خروج" ایجاد می نمایم. پس از انجام مراحل فوق فرم اصلی شما باید به این ترتیب باشد:
حالا من به دو متغیر نیاز دارم. متغیر اول برای اینکه بدونم که در هر لحظه چه فایلی باز شده است (من مسیر فایلی که باز کردم را نگه می دارم) از جنس string و با نام currentFilePath نگه می دارم. وقتی که فایل جدید دارم مقدار این متغیر را به string.Empty یا همان "" ست می کنم. متغیر دوم ، برای این است که بدونم آیا فایلی رو که بازکردم تغییر دادم یا نه. این متغیر را از جنس bool و با اسم isDirty نگه می دارم. در صورتیکه این مقدار این متغیر به true ست شده باشه معنی اش اینه که کاربر از زمانی که فایل را باز کرده تغییری در آن ایجاد کرده است.حالا روی منوی جدید دوبار کلیک می کنم تا متد Handler برای رویداد کلیک این منو آیتم ایجاد شود. در این متد من باید 3 کار اصلی در این متد انجام بدم:1. اطلاعات موجود در TextBox فرم را پاک کنم.
2. متغیر currentFilePath را به string.Empty ست کنم. (با اینکار اعلام میکنم که یک فایل جدید دارم)
3. متغیر isDirty را به false ست کنم. (با اینکار اعلام می کنم که هنوز کاربر تعییری ایجاد نکرده است)پس شما باید این سه خط کد را داشته باشید:private void mnuFileNew_Click(object sender, EventArgs e)
{
txtContent.Text = string.Empty;
currentFilePath = string.Empty;
isDirty = false;
}
برروی منوی "بازکردن" دوبار کلیک می کنم و داخل متد Handler مربوط به رویداد کلیک کد زیر را می نویسم.
در خطا اول این کد یک شیء از جنس OpenFileDialog ایجاد می کنم. این شیء برای ایجاد پنجره انتخاب فایل استفاده خواهد شد. این پنجره امکان انتخاب کردن انواع فایل ها را داره ولی من می خواهم که فقط فایل های با پسوند txt را انتخاب نمایم. برای همین منظور در خط دوم این کد با استفاده از خصوصیت Filter مقدار مورد نظرم را به صورت یک string وارد می کنم. در خط سوم با استفاده از متد ShowDialog منتظر می مانم که کاربر فایل مورد نظرش را انتخاب نماید. در صورتیکه کاربر بر روی گزینه Cancel کلیک کند از این متد خارج خواهم شد ولی غیر این صورت فایل را با استفاده از خطوط بعدی باز کرده و اطلاعات آن را بر روی TextBox موجود در صفحه نمایش می دهم. ضمنا مسیر فایل باز شده را در متغیر currentFilePath را ست می کنم و متغیر isDirty را به false مشخص میکنم.


حالا باید فایل مورد نظرم را باز کنم و محتویات آن را خوانده و درون TextBox وارد نمایم تا کاربر بتواند متحویات آن را ویرایش نماید. برای اینکار باید یک شی از جنس FileStream ایجاد کنم. متد سازنده (Constructor) این کلاس دارای چندین ورژن مختلف با ورودی های مختلف می باشد. من از ورژنی استفاده می کنم که مسیر فایل و مقداری از جنس FileMode را به عنوان ورودی از من می گیرد. مقدار مسیر فایل را از خصوصیت FileName شی opf و مقدار FileMode را به Open (برای بازکردن فایل) پاس می کنم.


سپس یک شیء از جنس StreamReader که وظیفه خواندن اطلاعات موجود در یک Stream را دارد ، ایجاد می کنم. در متد سازنده این کلاس شیء FileStream خود را پاس می کنم تا مشخص کنم که قصد دارم محتویات این Stream را بخوانم. در کلاس StreamReader متدهای مختلفی برای خواندن محتویات وجود دارد که من از متد ReadToEnd برای خواندن کلیه محتویات تا انتهای این فایل استفاده کرده ام. این متد دارای خروجی از نوع String می باشد. حالا خروجی این متد را داخل TextBox موجود در صفحه قرار داده و خصوصیت isDirty را به false و خصوصیت currentFilePath را به مسیر فایل باز شده ست می کنم:


private void mnuFileOpen_Click(object sender, EventArgs e)
{
OpenFileDialog opf = new OpenFileDialog();
opf.Filter = "Text Files (*.*)|*.txt";
if(opf.ShowDialog() == DialogResult.OK)
{
FileStream selectedFile = new FileStream(opf.FileName, FileMode.Open);
StreamReader reader = new StreamReader(selectedFile);
txtContent.Text = reader.ReadToEnd();
reader.Close();
isDirty = false;
currentFilePath = opf.FileName;
}
}

اگر مثال خود را تا اینجا تست کنید شما می توانید محتویات یک فایل Text را خوانده و برای کاربران نمایش دهید. در قسمت بعدی این مثال را ادامه خواهیم داد.
 
آخرین ویرایش توسط مدیر:

negar.mi

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

hajbaba

عضو جدید
باید برای هر موجودیت ی جدول طراحی کرد.
هر چیزی که بخواهیم در بارش اطلاعات ذخیره کنیم ی موجودیته.
مثال : مسافر ی موجودیته و مشخصاتش صفات اونه.
هر موجودیت تعدادی صفت داره ک این صفتا فیلدهای جدولو تشکیل می دن.
بسته به نوع طراحی و رابطه بین موجودیت ها تعداد جدول ها فرق داره.
شما اول باید نمودار ER رو برای محیط عملیاتی رسم کنین، از روی اون همه چیز مشخص میشه.
 
بالا