C#. Windows Forms. Розробка додатку копіювання файлів. Клас FileStream.




Розробка програми копіювання файлів. Клас FileStream

У роботі розроблено додаток, який демонструє використання класу FileStream для виконання операцій з файлами. Також продемонстровано застосування елементів управління OpenFileDialog та SaveFileDialog.


Зміст

Пошук на інших ресурсах:


Умова задачі

Розробити додаток, який здійснює операцію копіювання файлів будь-якого формату. У додатку повинні задаватись файл-джерело та файл-призначення.

 

Виконання

1. Завантажити Microsoft Visual Studio. Створити додаток за шаблоном Windows Forms Application. Зберегти проект

Приклад створення та збереження нового проекту за шаблоном Windows Forms Application детально описаний тут. Зберегти проект під деяким іменем.

 

2. Розробка форми

Створити форму як показано на рисунку 1.

Елементи управління, що розміщуються на формі, наступні:

  • три елементи управління типу Button з іменами button1, button2, button3;
  • три елементи управління типу Label з іменами label1, label2, label3.

C# Windows Forms Елементи управління формаРис. 1. Елементи управління на формі

 

3. Налаштування властивостей елементів управління.

Формуємо властивості форми Form1:

  • властивість StartPosition = “CenterScreen”;
  • властивість ControlBox = false;
  • властивість Text = “Демонстраційна програма копіювання файлів”.

Також формуємо властивості елементів управління.

  • в елементі управління button1 властивість Text = “Файл – джерело”;
  • в button2 властивість Text = “Файл – приймач”;
  • в button3 властивість Text = “Копіювати“;
  • в label1 властивість Text = ““;
  • в label2 властивість Text = “”;
  • в label3 властивість Text = ““.

Корегуємо розміри та позиції елементів управління так як показано на рисунку 2.

C# Windows Forms Форма додатку після налаштуванняРис. 2. Форма додатку після налаштування

 

4. Елементи управління OpenFileDialog та SaveFileDialog.

З панелі Toolbox розміщуємо на формі елементи управління OpenFileDialog та SaveFiledialog з вкладки Dialogs (рис. 3). Після розміщення, отримуємо об’єкти з іменами openFileDialog1 та saveFileDialog1.

C# Windows Forms Елементи управління OpenFileDialog SaveFileDialogРис. 3. Елементи управління OpenFileDialog та SaveFileDialog

 

5. Ввід внутрішніх змінних

В тілі класу Form1 потрібно ввести внутрішні змінні f_open та f_save. На даний момент текст модуля Form1.cs наступний

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication4
{
    public partial class Form1 : Form
    {
        private bool f_open, f_save;

        public Form1()
        {
            InitializeComponent();
        }
    }
}

 

6. Програмування події Form_Load().

Лістинг обробника події Load наведено нижче:

private void Form1_Load(object sender, EventArgs e)
{
  label1.Text = "None";
  label2.Text = "None";
  label3.Text = "";
  f_open = false;
  f_save = false;
}

Подія Load викликається на початку роботи програми. В обробнику події Form_Load() здійснюється початкова ініціалізація об’єктів та змінних.



 

7. Програмування події кліку на кнопці button1Файл-джерело»)

Вибір файлу-джерела здійснюється після кліку мишкою на кнопці «Файл-джерело».

Лістинг обробника події кліку на кнопці button1 наведено нижче.

// Open File
private void button1_Click(object sender, EventArgs e)
{
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
        label1.Text = openFileDialog1.FileName;
        f_open = true;
    }
    else
    {
        label1.Text = "None";
        f_open = false;
    }
}

Елемент управління OpenFileDialog забезпечує виклик стандартного вікна Windows для вибору файлу. У програмі для відкриття вікна вибору файлу потрібно викликати метод ShowDialog(). Якщо, після закриття вікна, результат повернення дорівнює OK, то ім’я вибраного файлу зберігається у властивості FileName.

Також прапорець f_open встановлюється в значення true. Це означає, що вибрано файл-джерело.

 

8. Програмування події кліку на кнопці button2Файл-приймач»)

Для вибору файлу-приймача використовується елемент управління saveFileDialog1. Він забезпечує виклик стандартного вікна Windows для вибору шляху та імені файлу, який буде створюватись (зберігатись).

// save file
private void button2_Click(object sender, EventArgs e)
{
    if (saveFileDialog1.ShowDialog() == DialogResult.OK)
    {
        label2.Text = saveFileDialog1.FileName;
        f_save = true;
    }
    else
    {
        label2.Text = "None";
        f_save = false;
    }
}

Виклик вікна здійснюється з допомогою методу ShowDialog(). Якщо вибрано ім’я файлу, що має створюватись, то після закриття вікна повертається значення OK. Повне ім’я файлу-приймача зберігається у властивості saveFileDialog1.FileName. Також прапорець f_save стає рівним “true”. Це означає, що вибрано файл-приймач.

 

9. Програмування події кліку на кнопці button3Копіювати»)

Для копіювання файлів використано можливості класу FileStream. Цей клас успадковується з класу Stream. У класі FileStream забезпечується можливість побайтного вводу/виводу. Це означає, що його можна застосувати до файлів будь-якого типу, навіть виконавчих.

Попередньо потрібно підключити простір імен System.IO

using System.IO;

Лістинг обробника події кліку на кнопці button3Copy») має вигляд:

private void button3_Click(object sender, EventArgs e)
{
  // перевірка, чи вибрано файл-джерело і файл-приймач
  if (!f_open || !f_save) return;

  FileStream fr = null; // fr – відповідає файлу-джерелу
  FileStream fw = null; // fw – відповідає файлу-приймачу

  int x;

  try
  {
    // відкриваємо файли
    fr = new FileStream(openFileDialog1.FileName, FileMode.Open);
    fw = new FileStream(saveFileDialog1.FileName, FileMode.Create);


    // копіюємо файли побайтно
    x = fr.ReadByte();
    while (x != -1)
    {
      fw.WriteByte((byte)x);
      x = fr.ReadByte();
    }
    label3.Text = "OK!";
  }
  catch (IOException exc)
  {
    label3.Text = exc.Message; // якщо виникла помилка при копіюванні
  }
  finally
  {
    // якщо все виконано, то закриваємо файли
    if (fr != null) fr.Close();
    if (fw != null) fw.Close();
  }
}

Для формування байтового потоку, що прив’язаний до файлу, у додатку створюються два об’єкти класу FileStream. Один об’єкт відповідає файлу-джерелу (fr), другий файлу-приймачу (fw).

При вказанні режиму доступу до файлу використовуються значення зі зчислення FileMode.

Якщо потрібно відкрити існуючий файл для читання, то вказується значення

FileMode.Open

Для створення нового файлу задається значення

FileMode.Create

Зчислення FileMode має й декілька інших значень.

Для читання байтів з файлу визначені два методи ReadByte() та Read(). Щоб прочитати один байт у програмі використовується метод

int ReadByte()

Якщо спроба відкрити файл є невдалою, то генерується виключення. Якщо файл неможливо відкрити через якусь помилку введення/виведення, то генерується виключення IOException.

Для запису байту в файл використовується метод

void WriteByte(byte value)

Параметр value задає байт, що записується.

Якщо під час запису виникає помилка, то генерується виключення IOException.

Після завершення роботи з файлом викликається метод Close(). У методі звільнюються системні ресурси, розподілені для цього файлу.

 


Зв’язані теми