Методы статического класса System.IO.File для работы с файлами. Чтение, запись текстового файла. Класс System.IO.StreamReader для реализации потокового чтения из файла.
Классы C#, обеспечивающие работу с файловой системой, расположены в пространстве имен System.IO. Поэтому для доступа к этим классам в коде без указания пространства имен необходимо использовать директиву подключения namespace:
using System.IO;
Статический класс File предоставляет основные функции для работы с файлами, в том числе нужные нам чтение файла в строку и запись строки в файл.
Чтение файла в строку. Для выбора исходного файла в структуре файловой системы используется элемент управления OpenFileDialog. Метод ShowDialog() отобразит диалог выбора файла на экран, а о том, какую кнопку в диалоге нажал пользователь можно узнать, сравнив значение, возвращенное методом с константами статического класса DialogResult. При значении, равном DialogResult.OK путь к выбранному файлу в файловой системе можно получить через свойство FileName экземпляра OpenFileDialog. Это значение нужно передать в метод ReadAllText класса File. Метод вернет нам содержимое исходного файла.
|
|
Запись строки в файл. Необходимо использовать метод WriteAllText класса File. В качестве параметров ему передаются имя файла и исходная строка. Широко распространенной практикой является проверка на существование файла перед записью с помощью метода Exists класса File.
Посимвольное чтение из файла. Класс StreamReader предоставляет методы чтения следующего символа, строки или блока в файле. Однако на каждом шаге необходимо сохранять данные о текущей строке, текущем символе и позиции символа в строке. Довольно логичным будет реализовать статический класс-обертку над StreamReader, который обеспечил бы нам не только чтение из файла,но и хранение этих данных. Реализуем этот функционал в классе Reader, созданном в ходе первой лабораторной работы (файл Reader.cs) Ниже приведен псевдокод данного класса.
Reader
{
номерСтроки;
позицияСимволаВСтроке;
текущийСимвол;
StreamReader streamReader;
читатьСледующийСимвол()
{
текущийСимвол = streamReader.Read();
если(текущийСимвол == -1)
текущийСимвол = конецФайла;
иначе если(текущийСимвол == переводСтроки)
{
номерСтроки++;
позицияСимволаВСтроке = 0;
}
иначе если(текущийСимвол == возвратКаретки или текущийСивол == табуляция)
читатьследующийСивол();
иначе
позицияСимволаВСтроке++;
}
инициализировать(путьКФайлу)
{
если файлСуществует(путьКФайлу)
{
streamReader = новый StreamReader(путьКФайлу);
номерСтроки = 1;
позицияСимволаВСтроке = 0;
читатьСледующийСимвол();
}
}
закрыть()
{
streamReader.close();
}
}
Протестировать работу класса Reader в коде формы можно, например, так:
|
|
Reader. инициализировать(путьКФайлу);
Пока (Reader.текущийСимвол!= конецФайла)
{
вывести Reader.номерСтроки;
вывести Reader. позицияСимволаВСтроке;
вывести Reader. текущийСимвол;
Reader. читатьСледующийСимвол();
}
Замечания по коду:
1) Все поля и методы должны быть объявлены как static;
2) В соответствии с принципами ООП все поля должны быть закрытыми (это замечание касается всех лабораторных работ). Для чтения полей необходимо реализовать методы-свойства. Ни одно из полей НЕ должно записываться вне класса.
3) Необходимо предусмотреть проблемные ситуации: указан некорректный путь к файлу, многократная инициализация класса (в этом случае необходимо закрывать streamReader перед его пересозданием).
Примеры кода:
Чтение файла в строку.
if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
codeFile = openFileDialog1.FileName.ToString();
string code = System.IO.File.ReadAllText(codeFile);
}