کنترل SaveFileDialog

کنترل System.Windows.Forms.SaveFileDialog به شما اجازه می‌دهد که یک فایل را ذخیره یا متنی را در یک فایل بنویسید. این کنترل همچنین به شما اجازه می‌دهد که در بین پوشه‌های موجود در سیستم خود یک پوشه را انتخاب کرده، سپس نام فایلی که قصد دارید اطلاعاتی را در آن قرار دهید را بنویسید. زمانی که نام فایلی که در پوشه جاری پنجره قرار دارد را بنویسید، یک پیغام خطا نمایش داده می‌شود، مبنی بر اینکه اطلاعات موجود در فایل دوباره نویسی می‌شود (overwrite). همچنین می‌توانید مسیر کامل فایل را در داخل جعبه متنی که در قسمت پایین آن قرار دارد بنویسید.
dialogs-04
در زیر تعدادی از خاصیت‌های مفید این کنترل را مشاهده می‌کنید:

خاصیت توضیح
AddExtention تعیین می‌کند که هنگامی که کاربر نام یک فایل بدون پسوند را تایپ می‌کند یک پسوند به طور خودکار به ان اضافه شود یا نه؟
CheckFileExists تعیین می‌کند زمانی که کاربر نام یک فایل را که وجود ندارد می‌نویسد یک پنجره‌ی اخطار به او نمایش داده شود یا نه؟
CheckPathExists تعیین می‌کند زمانی که کاربر مسیری که وجود ندارد را می‌نویسد یک پنجره‌ی اخطار به او نمایش داده شود یا نه؟
DefaultExt پسوند پیشفرض. زمانی که کاربر نام فایل را بدون پسوند بنویسد به طور خودکار به نام فایل اضافه می‌شود.
FileName فایلی که توسط کاربر انتخاب شده است.
Filter با استفاده از این خاصیت می‌توانید لیست فایل‌های داخل پنجره را فیلتر کنید.
FilterIndex اگر فیلترهای متفاوتی در دسترس باشد، با استفاده از این خصوصیت می‌توانید تعیین کنید که کدام فیلتر به پنجره اعمال شود.
InitialDirectory دایرکتوری پیشفرضی که هنگام نمایش پنجره در آن قرار داریم را تعیین می‌کند.
OverwritePrompt زمانی که فایل مورد نظر شما در پنجره موجود باشد یک پیغام به شما نمایش داده می‌شود.
Title عنوان پنجره

خاصیت AddExtension به طور خودکار زمانی که کاربر فایل بدون پسوندی را بنویسد، پسوندی که در خاصیت DefaultExt قرار دارد را به آن اضافه می‌کند. توصیه می‌شود که مقدار دو خاصیت CheckFileExists و CheckPathExists را برابر true قرار دهید تا زمانی که فایل یا مسیر مشخصی وجود ندارد، به کاربر اخطاری نمایش داده شود. خصوصیت InitialDirectory تعیین کننده پوشه پیشفرضی است که هنگام نمایش دیالوگ در آن قرار داریم. خصوصیت Title نمایانگر متنی است که در عنوان دیالوگ قرار دارد.

مشخص کردن نوع فایل

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

Description1|Extension1|Description2|Extention2|...DescriptionN|ExtentionN

ابتدا برای نوع فایل یک توضیح می‌نویسیم. در ادامه یک کاراکتر | و سپس نوع فایل را می‌نویسیم. به عنوان مثال الگوی زیر به شما اجازه می‌دهد که فایل را فقط به صورت متنی ذخیره کنید.

Text Files|.txt

شرح فایل در مثال بالا برابر Text Files و پسوند آن برابر txt. است. این امکان وجود دارد که چندین پسوند را مشخص کنید. به عنوان نمونه الگوی زیر به شما اجازه می‌دهد که یک فایل را به متنی با پسوند txt. با به صورت تصویری با پسوند png. ذخیره کنید.

Text Files|*.txt|Image|*.png

نوع فایل را از کامبو باکسی که در زیر جعبه متن نام فایل قرار دارد انتخاب می‌کنید.
save-file-dialog-01

یک مثال از کاربرد کنترل SaveFileDialog

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

using System.IO;

یک فرم شبیه فرم زیر طراحی کنید. از جعبه متنی که خاصیت mutiline آن برابر true است استفاده کنید. یک کنترل SaveFileDialog را از قسمت Dialogs جعبه ابزار بر روی بکشید.
save-file-dialog-02
بر روی دکمه دوبار کلیک کنید، تا کنترل کننده رویداد کلیک آن ایجاد شود. به شکل زیر کدهای مشابه را در کنترل کننده رویداد قرار دهید.

   1: private void button1_Click(object sender, EventArgs e)
   2: {
   3:     //Specify the extensions allowed
   4:     saveFileDialog1.Filter = "Text files (*.txt)|*.txt";
   5:     //Empty the FileName text box of the dialog
   6:     saveFileDialog1.FileName = String.Empty;
   7:     //Set default extension as .txt
   8:     saveFileDialog1.DefaultExt = ".txt";
   9: 
  10:     //Open the dialog and determine which button was pressed
  11:     DialogResult result = saveFileDialog1.ShowDialog();
  12: 
  13:     //If the user presses the Save button
  14:     if (result == DialogResult.OK)
  15:     {
  16:         //Create a file stream using the file name
  17:         FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.Create);
  18: 
  19:         //Create a writer that will write to the stream
  20:         StreamWriter writer = new StreamWriter(fs);
  21:         //Write the contents of the text box to the stream
  22:         writer.Write(textBox1.Text);
  23:         //Close the writer and the stream
  24:         writer.Close();
  25:     }
  26: }

خط 4 تعیین می‌کند که کاربرد فقط می‌تواند محتوای جعبه متنی را در یک فایل متنی قرار دهد. خط 6 مقدار empty را به خصوصیت FileName نسبت می‌دهد تا در زمان نمایش هیچ فایلی به طور پیشفرض انتخاب نشود. مقدار خاصیت DefaultExt را برابر txt. قرار داده‌ایم تا اگر کاربر پسوند فایل مورد نظر خود را فراموش کند برنامه به طور خودکار این پسوند را به انتهای نام فایل اضافه کند. سپس با استفاده از متد ()ShowDialog پنجره را نمایش می‌دهیم. خروجی این متد از نوع DialogResult است.
هنگامی که کاربر بر روی دکمه Save کلیک می‌کند خروجی متد برابر DialogResult.OK می‌شود (خط 14). با استفاده از دستور if خروجی متد را بررسی می‌کنیم، اگر کاربر بر روی OK کلیک کرد سپس در خط 17 یک شیء از کلاس FileStream ساخته و خاصیت‌های FileName و FileMode آنرا تنظیم کرده‌ایم. این خط در اصل مسئول ایجاد یک فایل متنی با نامی است که ما در کادر FileName پنجره saveFileDialog مشخص کرده‌ایم. سپس یک شیء از کلاس StreamWriter ساخته و شیء FileStream قبلی را به آن انتقال می‌دهیم. با این کار به برنامه می گوییم که قرار است در فلان فایل عمل نوشتن صورت بگیرد.
با استفاده از متد ()Write متن موجود در جعبه متن را در استریم یا همان فایلی که ایجاد کرده‌ایم نوشته و سپس با استفاده از متد ()Close استریم را می‌بندیم. برنامه را اجرا و متنی را داخل جعبه متن بنویسید. بر روی دکمه کلیک کنید و یک پوشه را انتخاب کنید. سپس نام یک فایل را بنویسید و بر روی دکمه Save پنجره کلیک کنید. اگر فایلی با همان نام نوشته شده توسط شما موجود باشد یک پیغام به شما نمایش داده می‌شود. در صورت تأیید پیغام، محتوای آن فایل کاملاً حذف و محتوای جدید به جای آن قرار می‌گیرد. اگر مقدار خاصیت OverwritePrmpt را برابر false قرار دهید پیغام خطا نمایش داده نمی‌شود .