воскресенье, 4 ноября 2012 г.

C#: Чтение, сохранение на диск файла из сборки.

Простой пример чтения *.rtf файла из сборки (*.exe,*.dll), и сохранения его на диск.
Таким же образом можно поступить с любым файлом,  архивом, текстовым документом, документом excel и т.д.


Добавление файла ресурсов (*.rtf файла) в проект:

1) Открываем Visual Studio 2010 (Visual C# express 2010), создаем проект Windows Form.

2) Открываем свойства (я открываю существующий проект)

image


Открываем вкладку Resources, находим и вставляем файл который будет “упакован” в нашу сборку:
image
Обратите внимание, что название файла в составе проекта и ресурсах разные.

Также стоит убедиться, что вы вставили файл *.rtf не как Text file (в принципе, возможно вставить и как текстовый, здесь этот вариант рассматривать не будем).

В свойствах файла в Solution Explorer ставим :
image



Чтение файла ресурсов *.rtf:

Теперь самое интересное. Добавляем код:



#region Чтение файла из ресурсов  (*.rtf)
          //Создаем новую форму
          Form proba = new Form()
                           {
                               StartPosition = FormStartPosition.CenterScreen,
                               Size = new Size(500, 500)
                           };
          RichTextBox rtb = new RichTextBox()
                                {
                                    Size = new Size(450, 450)
                                };
          //using System.Text
          //using System.IO
          using (MemoryStream ms = new MemoryStream())
          {
              // Считываем файл в массив байтов buffer
              byte[] buffer = Properties.Resources._1;
              
              
            //Возможен еще такой вариант, если вы выставили
            //в свойствах файл text:
            //byte[] buffer = Encoding.UTF8.GetBytes(Properties.Resources._1);
            
          // Пишем в MemoryStream с первого байта до последнего (buffer.Length) 
              ms.Write(buffer, 0, buffer.Length);
              // Выставляем на начало записи потока
              ms.Seek(0, SeekOrigin.Begin);
              // Загружаем наш поток MemoryStream в RichTextBox
              rtb.LoadFile(ms, RichTextBoxStreamType.RichText);
          }
          proba.Controls.Add(rtb);
          proba.Show(this);
          
          #endregion


Проверяем, все работает.
image


Запись файла ресурсов *.rtf на диск:

#region Запись файла(файлов) ресурсов на диск 
             // Файлы ресурсов добавляется через свойства проекта => ресурсы (в  
             //свойствах  ставим binary) 
           //Создаем объект FolderBrowserDialog
           FolderBrowserDialog fb = default(FolderBrowserDialog);
           //Путь сохранения файла
           string exe_path = null;
           fb = new FolderBrowserDialog();
           fb.Description = "Выберите папку сохранения файла";
           //Если папка выбрана:
 if (fb.ShowDialog() == DialogResult.OK & !string.IsNullOrEmpty(fb.SelectedPath))
   {
    try
       {
                   //Список файлов в ресурсах, перечисляем через запятую
                   string[] res_files = new string[] { "_1" };
                   byte[] buff = null;
                   object objBuff = null;
 
          for (int i = 0; i <= res_files.Length - 1; i++)
           {
           exe_path = Path.Combine(fb.SelectedPath, res_files[i] + ".rtf");
           
           //Если файл не создан, создаем поток, записываем файл
          if (!File.Exists(exe_path))
          {
         //Создаем объект для временного сохранения каждого файла
          objBuff = Properties.Resources.ResourceManager.GetObject(res_files[i]);
                           //Если файл не пуст обрабатываем
          if ((buff = objBuff as byte[]) != null)
             {
             using (FileStream fs = new FileStream(exe_path, FileMode.Create))
                               {
                                   //Записываем 
                                   fs.Write(buff, 0, buff.Length);
                                   //Сохраняем данные из буффера на диск
                                   fs.Flush();
                               }
                           }
                       }
                   }
 
                   //using System.Diagnostics;
                   Process.Start(fb.SelectedPath);
 }
 catch (Exception ex)
 {
MessageBox.Show("Проверьте есть ли у вас права доступа для записи файла!\n" 
 + ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                                   
 }
} 
           #endregion

Vadim Semenov 2012. Email: 5587394@mail.ru

Комментариев нет:

Отправить комментарий