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

نوشتن در یک فایل متنی راهی برای ذخیره دائمی داده‌ها می‌باشد. با وجودیکه بیشتر از دیتابیس‌ها و فایل‌های XML برای ذخیره اطلاعات استفاده می‌شود، اما فایل‌های متنی همچنان در برنامه‌های قدیمی مورد استفاده قرار می‌گیرند. البته اگر برنامه شما کوچک و داده‌های آن کم هستند بهتر است از فایل متنی برای ذخیره اطلاعاتتان استفاده کنید. قبل از نوشتن اطلاعات، به یک استریم نیاز داریم خصوصاً یک استریم فایل. یک استریم می‌تواند به یک فایل در روی سیستم شما یا سوکت شبکه یا…. اشاره کند.
کلاس FileStream بیانگر استریمی است که به یک فایل اشاره می‌کند. شیء از نوع FileStream به عنوان آرگومان، در سازنده کلاس StreamWriter استفاده می‌شود. کلاس StreamWriter مسئول نوشتن در استریم است، که در این مثال همان فایل است. ابتدا توجه کنید که کلاس‌های FileStream و StreamWriter در فضای نامی System.IO قرار دارند. نمونه برنامه زیر، اطلاعات نام، نام خانوادگی و سن را از کاربر دریافت می‌کند.

  1: using System;
  2: using System.IO;
  3: using System.Text;
  4: 
  5: namespace WritingToFile
  6: {
  7:     class Program
  8:     {
  9:         static void Main()
 10:         {
 11:             try
 12:             {
 13:                 FileStream fs = new FileStream("sample.txt", FileMode.Create);
 14:                 StreamWriter writer = new StreamWriter(fs);
 15:                 StringBuilder output = new StringBuilder();
 16:                 int repeat = 0;
 17: 
 18:                 do
 19:                 {
 20:                     Console.WriteLine("Please enter first name: ");
 21:                     output.Append(Console.ReadLine() + "#");
 22:                     Console.WriteLine("Please enter last name: ");
 23:                     output.Append(Console.ReadLine() + "#");
 24:                     Console.WriteLine("Please enter age: ");
 25:                     output.Append(Console.ReadLine());
 26:                     writer.WriteLine(output.ToString());
 27:                     output.Clear();
 28:                     Console.WriteLine("Repeat? 1-Yes, 0-No : ");
 29:                     repeat = Convert.ToInt32(Console.ReadLine());
 30:                 } while (repeat != 0);
 31: 
 32:                 writer.Close();
 33:             }
 34:             catch (IOException ex)
 35:             {
 36:                 Console.WriteLine(ex.Message);
 37:             }
 38:         }
 39:     }
 40: }
Please enter first name: John
Please enter last name: Smith
Please enter age: 21
Repeat? 1-Yes, 0-No: 1
Please enter first name: Mike
Please enter last name: Roberts
Please enter age: 31
Repeat? 1-Yes, 0-No: 1
Please enter first name: Garry
Please enter last name: Mathews
Please enter age: 27
Repeat? 1-Yes, 0-No: 0

خروجی نشان می‌دهد که در مثال بالا مشخصات 3 شخص از کاربر دریافت و آنها را در یک فایل متنی که در شیء FileStream مشخص شده می‌نویسد. در خط 13 یک شیء از نوع FileStream ایجاد شده است. فایل در مسیری که برنامه اجرا می‌شود، ایجاد خواهد شد. سازنده کلاس FileStream همانطور که می‌بینید 2 آرگومان دریافت می‌کند: یکی مسیر فایل و دیگری مقدار یک نوع شمارشی. نوع شمارشی تعیین می‌کند که سیستم عامل چگونه فایل را باز کند. مقادیر مجاز برای این نوع شمارشی را در پایین می‌بینید.

مقدار توضیح
Append اشاره گر را به انتهای فایل می‌برد و عمل نوشتن در آنجا آغاز می‌شود. اگر فایل وجود نداشته باشد آنرا ایجاد می‌کند.
Create فایل را ایجاد می‌کند، اگر فایل وجود داشته باشد اطلاعات آن را حذف می‌کند.
CreateNew یک فایل جدید ایجدا می‌کند. اگر فایل وجود داشته باشد یک استثنا از نوع System.IO.IOException رخ می‌دهد.
Open یک فایل موجود را باز می‌کند. یک مقدار از نوع شمارشی System.IO.FileAccess رفتار این مقدار را مشخص می‌کند. اگر فایلی برای باز کردن وجود نداشته باشد یک استثنا از نوع System.IO.FileNotFoundException رخ می‌دهد.
OpenOrCreate مشابه Open عمل می‌کند با این تفاوت اگر فایلی وجود نداشته باشد آن را ایجاد می‌کند.

ارسال FileMode.Create باعث می‌شود که یک فایل جدید ایجاد شود، اگر فایل موجود باشد اطلاعات آن دوباره نویسی می‌شود. اگر بخواهیم اطلاعاتی را به انتهای یک فایل موجود اضافه کنیم از FileMode.Append استفاده می‌کنیم. یک نوع شمارشی دیگر، System.IO.FileAccess است که عملیاتی را که قصد دارید بر روی فایل انجام دهید مشخص می‌کند. مقادیر آن در زیر نشان داده شده است.

مقدار توضیح
Read تنها مجاز به خواندن از فایل هستید
Write فقط اجازه نوشتن در فایل را دارید
ReadWrite مجاز به نوشتن و خواندن از فایل هستید.

برای استفاده از این نوع شمارشی، باید از سازنده دیگری از کلاس FileStream استفاده کنید که آرگومان دیگری از نوع شمارشی FileAccess می‌پذیرد.

FileStream fs = new FileStream("sample.txt", FileMode.Create, FileAccess.ReadWrite);

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

StreamWriter writer = new StreamWriter(fs);

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

مقدار توضیح
Write داده ها را در فایل می نویسد
WriteLine داده ها را در فایل می نویسد، سپس یک کاراکتر خط جدید در انتهای آن قرار می دهد.
Close استریم را می بندد.

در خطوط 25-20 از کلاس StringBuilder برای تولید خروجی استفاده کرده‌ایم. به این نکته توجه کنید که در انتهای نام و نام خانوادگی یک کاراکتر # قرار داده‌ایم. به این دلیل هنگام خواندن اطلاعات از فایل تفکیک اطلاعات به آسانی انجام شود. شما می‌توانید به جای نوشتن این کاراکتر از هر کاراکتر خاص دیگر همچون $ استفاده کنید. بعد از نوشتن اطلاعات سرانجام باید استریم را ببندیم که این کار را در خط 32 و با استفاده از متد Close() انجام داده‌ایم تا منابع را از حافظه آزاد کند.
همه‌ی خطوط را در یک بلوک try/catch قرار داده‌ایم زیرا این عملیات ممکن است یک استثنای System.IO.IOException تولید کند. به عنوان مثال، اگر فایل موجود نباشد این استثنا رخ می‌دهد. خطوط 37-34 این استثنا را گرفته و پردازش می‌کند. اجازه دهید به محتوای فایل نگاهی بیندازیم :

John#Smith#21
Mike#Roberts#31
Garry#Matthews#27

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