Создание приложения копирования файлов. Класс FileStream
В работе разработано приложение, которое демонстрирует использование класса FileStream для выполнения операций с файлами. Также продемонстрированы применения элементов управления OpenFileDialog и SaveFileDialog.
Содержание
- Условие задачи
- Выполнение
- 1. Запустить MS Visual Studio. Создать приложение по шаблону Windows Forms Application. Сохранить проект
- 2. Проектирование формы
- 3. Настройка свойств элементов управления.
- 4. Элементы управления OpenFileDialog и SaveFileDialog
- 5. Ввод внутренних переменных
- 6. Программирование события Form_Load()
- 7. Программирование события клика на кнопке button1 («Файл-источник»)
- 8. Программирование события клика на кнопке button2 («Файл-приемник»)
- 9. Программирование события клика на кнопке button3 («Копировать»)
Поиск на других ресурсах:
Условие задачи
Разработать приложение, которое реализует копирование файлов любого формата. В приложении должны задаваться файл-источник и файл-назначение.
⇑
Выполнение
1. Запустить MS Visual Studio. Создать приложение по шаблону Windows Forms Application. Сохранить проект
Подробный пример создания и сохранения нового проекта на основе шаблона Windows Forms Application подробно описывается здесь.
⇑
2. Проектирование формы
Создать форму как показано на рисунке 1. Элементы управления, которые размещаются на форме, следующие:
- три элемента управления типа Button с именами button1, button2, button3;
- три элемента управления типа Label с именами label1, label2, label3.
Рис. 1. Элементы управления на форме
⇑
3. Настройка свойств элементов управления.
Формируем свойства формы Form1:
- свойство StartPosition = “CenterScreen”;
- свойство ControlBox = false;
- свойство Text = “Демонстрационная программа копирования файлов”.
Также настраиваем следующие свойства элементов управления
- в элементе управления button1 свойство Text = “Файл — источник”;
- в button2 свойство Text = “Файл — приемник”;
- в button3 свойство Text = «Копировать«;
- в label1 свойство Text = «—«;
- в label2 свойство Text = “—”;
- в label3 свойство Text = “—“.
Корректируем размеры и позиции элементов управления так как показано на рисунке 2.
Рис. 2. Форма приложения после настройки
⇑
4. Элементы управления OpenFileDialog и SaveFileDialog.
Из панели Toolbox размещаем на форме элементы управления OpenFileDialog и SaveFiledialog из вкладки Dialogs (рис. 3). После размещения получаем объекты с именами openFileDialog1 и saveFileDialog1.
Рис. 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(). В методе освобождаются системные ресурсы, распределенные для этого файла.
⇑