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.

02_02_00_010_01_Рис. 1. Элементы управления на форме

 

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

Формируем свойства формы Form1:

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

Также настраиваем следующие свойства элементов управления

  • в элементе управления button1 свойство Text = “Файл — источник”;
  • в button2 свойство Text = “Файл — приемник”;
  • в button3 свойство Text = «Копировать«;
  • в label1 свойство Text = ««;
  • в label2 свойство Text = “”;
  • в label3 свойство Text = ““.

Корректируем размеры и позиции элементов управления так как показано на рисунке 2.

02_02_00_010_02rРис. 2. Форма приложения после настройки

 

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

Из панели Toolbox размещаем на форме элементы управления OpenFileDialog и SaveFiledialog из вкладки Dialogs (рис. 3). После размещения получаем объекты с именами openFileDialog1 и saveFileDialog1.

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