Ватсон Карли
Шрифт:
FileInfo MyFile = new FileInfo(@"C:\My Documents\NewFile.txt");
StreamWriter sw = MyFile.CreateText;
Так же, как и со всеми другими потоковыми классами, важно закрыть
StreamWriter
, когда работа закончена: sw.Close;
Запись в поток делается с помощью любого из четырех перегружаемых методов
StreamWriter.Write
. Простейший из них записывает строку и дополняет ее комбинацией возврат каретки — перевод строки: string NextLine = "Groovy Line";
sw.Write(NextLine);
Можно также записать один символ:
char NextChar = 'а';
sw.Write(NextChar);
Массив символов также возможен:
char [] Char Array = new char[100];
// инициализация этого массива символов
sw.Write(CharArray);
Можно даже записать часть массива символов:
int nCharsToWrite = 50;
int StartAtLocation = 25;
char [] CharArray = new char[100];
// инициализируем эти символы
sw.Write(CharArray, StartAtLocation, nCharsToWrite);
Пример: ReadWriteText
Пример
ReadWriteText
выводит результат использования классов StreamReader
и StreamWriter
. Он похож на предыдущий пример ReadBinaryFile
, но предполагает, что считываемый файл является текстовым файлом, и выводит его в этом виде. Он может сохранить файл (со всеми изменениями, которые будут сделаны в тексте в текстовом поле). Он будет сохранять любой файл в формате Unicode. Снимок показывает использование
ReadWriteText
для вывода того же файла CivNegotiations
, который использовался раньше. В этот раз, однако, мы сможем прочитать содержимое гораздо легче. Не будем вдаваться в детали добавления методов обработки событий для диалога открытия файла, поскольку они по сути такие же, что и в примере
BinaryFileReader
. Как и для данного примера, открытие нового файла приводит к вызову метода DisplayFile
. Единственное реальное различие между этим примером и предыдущим состоит в реализации DisplayFile
, а также в том факте, что теперь имеется возможность сохранить файл. Она представлена другим пунктом меню — save. Обработчик для этого пункта вызывает другой добавленный в код метод — SaveFile
. (Отметим, что этот файл всегда перезаписывает первоначальный файл, этот пример не имеет возможности записи в другой файл.) Посмотрим сначала на
SaveFile
, так как это простейшая функция. Мы просто записываем каждую строку текстового поля по очереди в поток StreamWriter
, полагаясь на метод StreamReader.WriteLine
для добавления комбинации возврата каретки-перевода строки в конце каждой строки: void SaveFile {
StreamWriter sw = new StreamWriter(ChosenFile, false, Encoding.Unicode);
foreach (string Line in textBoxContents.Lines) sw.WriteLine(Line);
sw.Close;
}
ChosenFile
является строковым полем основной формы, которое содержит имя прочитанного файла (как и в предыдущем примере). Отметим, что при открытии потока определяется кодирование Unicode. Если желательно записывать файлы в другом формате, необходимо изменить значение этого параметра. Второй параметр в этом конструкторе будет задан как true, если мы хотим добавлять к файлу, но в данном случае мы этого не делаем. Кодирование должно задаваться во время создания объекта записи потока. В дальнейшем оно доступно только для чтения как свойство Encoding
. Теперь проверим, как считываются файлы. Процесс чтения осложняется тем, что мы не знаем, пока не прочитаем файл, сколько строк он будет содержать (другими словами, сколько последовательностей
(char)13 - (char)10
находится в файле). Решим эту проблему, считывая сначала файл в экземпляр класса StringCollection
, который находится в пространстве имен System.Collections.Specialized
. Этот класс создан для хранения множества строк, которые могут динамически увеличиваться. Он реализует два интересующих нас метода: Add
, добавляющий строку в коллекцию, и CopyTo
, который копирует коллекцию строк в обычный массив (экземпляр System.Array
). Каждый элемент объекта StringCollection
будет содержать одну строку файла. Метод
DisplayFile
вызывает другой метод ReadFileIntoStringCollection
, который реально считывает файл. После этого мы знаем, сколько имеется строк, поэтому можно скопировать StringCollection
в обычный массив фиксированного размера и передать этот массив в текстовое поле. Так как при создании копии копируются только ссылки на строки, а не сами строки, процесс будет достаточно эффективным: void DisplayFile {
StringCollection LinesCollection = ReadFileIntoStringCollection;