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

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

У програмі продемонстровано використання класів StreamWriter та StreamReader для читання та запису текстових файлів.

Також у програмі використані елементи управління RichTextBox та OpenFileDialog.


Зміст



Умова задачі

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

 

Виконання

1. Завантажити Microsoft 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 об’єкту openFileDialog1.

Для читання текстового файлу використовується клас 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.

 


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