010 — C#. Пример создания приложения копирования файлов. Класс FileStream.

Создание приложения копирования файлов. Класс FileStream

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


Содержание



Условие задачи

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

 

Выполнение

1. Запустить MS 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 приведен ниже.

// Открытие файла
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 для выбора пути и имени файла, который будет создаваться (сохраняться).

// сохранить файл
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. Полное имя файла-приемника сохраняется в свойстве FileName. Также флажок f_save становится равным “true”. Это означает, что выбран файл-приемник.

 

9. Программирование события клика на кнопке button3Копировать»).

Для копирования файлов использованы возможности класса FileStream. Этот класс наследуется из класса Stream. В классе FileStream обеспечивается возможность побайтового ввода/вывода. Это означает, что его можно применить к файлам любого типа, даже исполняемым.

Предварительно нужно подключить пространство имен System.IO.

using System.IO;

Листинг обработчика события клика на кнопке button3 («Copy») имеет вид:

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(). В методе освобождаются системные ресурсы, распределенные для этого файла.