012 — C# — Разработка программы чтения и записи текстовых файлов. Классы StreamWriter и StreamReader

Разработка программы чтения и записи текстовых файлов. Классы StreamWriter и StreamReader

В программе продемонстрировано использование классов StreamWriter и StreamReader для чтения и записи текстовых файлов. Также в программе использованы элементы управления (компоненты) RichTextBox и OpenFileDialog.


Содержание


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

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

 

Выполнение

1. Запустить MS Visual Studio. Создать проект по шаблону Windows Forms Application

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

 

2. Разработка формы приложения

Создать форму как показано на рисунке 1.

На форме размещаются следующие элементы управления:

  • два элемента управления типа Button. Автоматически будут созданы два объекта (экземпляры класса Button) с именами button1 и button2;
  • один элемент управления типа RichTextBox. Автоматически создается объект с именем richTextBox1;
  • элемент управления типа Label. Создается объект с именем label1.

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

Осуществить настройку элементов управления типа Button следующим образом:

  • в элементе управления button1 свойство Text = “Открыть файл …»;
  • в элементе управления button2 свойство Text = “Сохранить файл».

Настройка формы приложения Form1:

  • свойство Text = “Чтение/запись текстовых файлов”;
  • свойство MaximizeBox = false (кнопка развертывания на весь экран становится неактивной);
  • свойство FormBorderStyle = “Fixed3D”;
  • свойство StartPosition = “CenterScreen”.

Также нужно откорректировать размеры формы и элементов управления на форме приблизительно так, как показано на рисунке 2.

В элементе управления RichTextBox (рис. 3):

  • свойство WordWrap = «false» (перенос длинных строк в пределах границ окна редактора).

Элемент управления RichTextBox представляет собой многострочное редактированное текстовое поле, которое работает с текстом в формате RTF (Rich Text Format – расширенный текстовый формат). Текст формата RTF сохраняет дополнительную служебную информацию, которая управляет свойствами каждого абзаца и изменением шрифта по ходу текста.

C# Windows Forms Форма приложенияРис. 2. Форма приложения после корректировки и настройки свойств

C# Windows Forms Элемент управления RichTextBox

Рис. 3. Элемент управления типа RichTextBox

 

3. Элемент управления OpenFileDialog

Для того, чтобы выбрать текстовый файл для чтения, нужно использовать элемент управления типа OpenFileDialog. Этот элемент управления представляет собой стандартное диалоговое окно Windows, предназначенное для открытия файлов.

Разместить на форме компонент OpenFileDialog (рис. 4).

C# Windows Forms Элемент управления OpenFileDialogРис. 4. Элемент управления OpenFileDialog

 

4. Добавление внутренних переменных в текст приложения

Для работы программы нужно ввести следующие дополнительные внутренние переменные:

  • f_open – определяет, выбрал ли пользователь файл командой «Открыть файл…»;
  • f_save – определяет, был ли сохранен ранее открытый файл (f_open = true).

Поэтому, в текст модуля “Form1.cs” нужно ввести следующий код:

...

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        bool f_open, f_save; // определяют выбор файла и его сохранение

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

...

 

5. Программирование события Load класса формы Form1

Событие Load возникает в момент загрузки формы сразу после запуска приложения на выполнение. В обработчик события целесообразно включать начальную инициализацию переменных.

В данном случае, начальной инициализации подлежат такие переменные и объекты как f_open, f_save, label1, richTextBox1.

В компоненте label1 будет отображаться путь к выбранному файлу. В компоненте richTextBox1 будет отображаться содержимое (текст) выбранного файла.



Листинг обработчика Form1_Load() события Load загрузки формы следующий:

private void Form1_Load(object sender, EventArgs e)
{
  f_open = false; // файл не открыт
  f_save = false;
  label1.Text = "-";
  richTextBox1.Text = "";
}

 

6. Импорт пространства имен System.IO

В данной работе для чтения и записи файлов будут использованы возможности классов StreamWriter и StreamReader из библиотеки классов языка C#.

Поэтому, для использования методов этих классов, нужно в начале кода модуля “Form1.cs” добавить строку:

using System.IO;

Таким образом, верхняя часть файла “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;
using System.IO;

 

7. Программирование события клика на кнопке button1 (“Открыть файл…»)

Для вызова стандартного окна Windows выбора файла, пользователь должен выбрать команду «Открыть файл…» (button1). Пример программирования события клика на кнопке button1 подробно описан здесь.

Листинг обработчика button1_Click() события Click кнопки button1, осуществляющей открытие окна выбора файла, следующий:

private void button1_Click(object sender, EventArgs e)
{
  // 1. Открытие окна и проверка, выбран ли файл
  if (openFileDialog1.ShowDialog() == DialogResult.OK)
  {
    // 2. Вывести имя файла на форме в компоненте label1
    label1.Text = openFileDialog1.FileName;

    // 3. Установить флажки f_open и f_save
    f_open = true;
    f_save = false;

    // 4. Прочитать файл в richTextBox1
    // очистить предыдущий текст в richTextBox1
    richTextBox1.Clear();

    // 5. Создать объект класса StreamReader и прочитать данные из файла
    StreamReader sr = File.OpenText(openFileDialog1.FileName);

    // дополнительная переменная для чтения строки из файла
    string line = null;
    line = sr.ReadLine(); // чтение первой строки

    // 6. Цикл чтения строк из файла, если строки уже нет, то line=null
    while (line != null)
    {
      // 6.1. Добавить строку в richTextBox1
      richTextBox1.AppendText(line);

      // 6.2. Добавить символ перевода строки
      richTextBox1.AppendText("\r\n");

      // 6.3. Считать следующую строку
      line = sr.ReadLine();
    }

    // 7. Закрыть соединение с файлом
    sr.Close();
  }
}

Для вызова стандартного окна Windows выбора файла используется метод ShowDialog() компонента openFileDialog1. Выбранный файл сохраняется в свойства FileName объекта openFileDialog.

Для чтения текстового файла используется класс StreamReader, который осуществляет чтение символьных данных из файла. Чтобы создать экземпляр класса StreamReader используется метод OpenText() класса File. Класс File содержит ряд методов, которые хорошо подходят для упрощенного чтения символьных данных.

Чтобы считать строку из файла в программе используется метод ReadLine(), считывающий строку символов из текущего потока и возвращающий данные в виде строки. Если достигнут конец файла, то метод возвращает null.

Чтение строк осуществляется в локальную переменную line.

Чтобы добавить строку к объекту richTextBox1, используется метод AppendText().

 

8. Программирование события изменения текста в компоненте RichTextEdit

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

В компоненте richTextBox1 есть событие TextChanged, которое вызывается в момент изменения текста в редакторе (рис. 5).

C# Windows Forms Событие TextChanged элемент управлени richTextBox1Рис. 5. Событие TextChanged элемента управления richTextBox1

Обработчик события TextChanged имеет следующий вид:

private void richTextBox1_TextChanged(object sender, EventArgs e)
{
  f_save = false;
}

 

9. Программирование события клика на кнопке “Сохранить файл

Для сохранения измененного текста в файле нужно выбрать команду «Сохранить файл» (кнопка button2). Для сохранения измененного в richTextBox1 файла используются методы класса StreamWriter.

Листинг обработчика события клика на кнопке button2 следующий:

private void button2_Click(object sender, EventArgs e)
{
  // 1. Проверка, открыт ли файл
  if (!f_open) return;

  // 2. Если файл открыт, то проверка – сохранен ли он
  if (f_save) return;

  // 3. Создание объекта типа StreamWriter и получение строчных данных
  StreamWriter sw = File.CreateText(openFileDialog1.FileName);

  // 4. Чтение строк с richTextBox1 и добавление их в файл
  string line;
  for (int i = 0; i < richTextBox1.Lines.Length; i++)
  {
    // 4.1. Чтение одной строки
    line = richTextBox1.Lines[i].ToString();

    // 4.2. Добавление этой строки в файл
    sw.WriteLine(line);
  }

  // 5. Закрыть объект sw
  sw.Close();
}

Объясним некоторые фрагменты кода.

В обработчике события button2_Click после проверки на наличие открытого файла создается объект (переменная) с именем sw типа StreamWriter.

При создании объекта используется метод CreateText() из типа File, возвращающего экземпляр типа StreamWriter. Имя файла сохраняется в свойстве openFileDialog1.FileName.

Для доступа к введенным строкам компонента richTextBox используется свойство Lines, которое есть массивом строк.

Чтобы добавить одну строку, нужно вызвать метод WriteLine() объекта sw типа StreamWriter.

 


Связанные темы