Использование классов StreamReader,StreamWriter и объекта My.Computer.FileSystem для работы с текстовыми файлами

Ранее был рассмотрен доступ к файлам с помощью дескрипторов (номеров), который является средством VB. В данной версии VS предпочтительным и более эффективным является потоковый доступ к файлам, который является средством .NET Framework и определен в пространстве имен (библиотеке классов) System.IO.

Поток ( Stream ) в VS –это абстрактный тип Stream, который представляет последовательность байтов (символов), передаваемых в среду или из среды для хранения информации. Потоки позволяют считывать и записывать данные на запоминающее устройство, которое в нашем случае соответствует файлу. Поэтому над потоками в основном выполняются операциичтения (Read), записи (Write)и поиска (Seek), которые реализованы в классеSystem.IO.Stream. Причем большинство потоковых объектов выполняют буферизацию данных, которая позволяет значительно повысить эффективность операций ввода/вывода.Например, данные потока не записываются сразу на диск, когда производится запись в файл, а помещаются в буфер и затем сбрасываются на диск, когда поток закрывается.

Таким образом, потоки классаSystem.IO.Streamосуществляют управление файлами на уровне отдельных байтов. Чтобы сделать операции чтения и записи более эффективными и удобными, в пространстве имен System.IO имеются средствадля открытия и отображения текстовых файлов. Так, например, имеются классы StreamReader и StreamWriter, а также объект My.Computer.FileSystem.

Чтобы использовать классы StreamReader и StreamWriter, в начале программного кода следует добавить оператор доступа к этим классам: Imports System.IO.

 

Класс StreamReaderиз библиотеки. NETFramework позволяет откры­вать в программе и отображать на экране текстовые файлы. На рис. 4.10.3-1 и рис. 4.10.3-2 представлены процедуры чтения содержимого всего текстового файла целиком в одну строку и построчного чтения данных из текстового файла. Обе эти процедуры имеют входной параметр filename(имя файла) и выходной параметр p (строка, содержащая значения, прочитанные из файла).

 

'Процедурачтенияизтекстовогофайла Sub readfile1(ByVal filename AsString, ByRef p AsString) 'создание потока для чтения из текстового файла Dim Rf As StreamReader Rf = New StreamReader(filename) Try p = Rf.ReadToEnd() 'чтение текста из файла в p Rf.close() 'закрытиепотока Catch ex As Exception MsgBox("Невозможно прочитать данные из файла") EndTry EndSub

Рис. 4.10.3-1

 

'Процедура построчного чтения данных из текстового файла, 'подсчета числа строк и формирования строки для вывода данных Sub readfile2(ByVal filename AsString, _ ByRef n AsInteger, ByRef p AsString) 'создание потока для чтения из текстового файл Dim Rf AsNew StreamReader(filename) Dim line AsString p = ""'строка с исходными данными n = 0 'количество строк в файле Try DoWhileNot Rf.EndOfStream() 'пока не достигнут конец потока line = Rf.ReadLine() 'чтение строки из файла в line n = n + 1 p = p & line & vbNewLine Loop Rf.Close() 'закрытиепотока Catch ex As Exception MsgBox("Невозможно прочитать данные из файла") EndTry EndSub

Рис. 4.10.3-2

 

Впримерах, представленных на рис. 4.10.3-1 и рис. 4.10.3-2,сначаласоздаются объекты Rf класса StreamReader – потоки открываются для чтения. Далее применяются методы созданных классов: в примере на рис.4.10.3-1 метод ReadToEnd()считывает всю информацию из файла в строковую переменную p, начиная с текущей позиции (в данном примере с начала файла) и до конца файла; в примере на рис. 4.10.3-2 метод ReadLine()считывает из потока Rf только одну строку символов и присваивает ее содержимое строковой переменной line. Метод ReadLine()здесь применяется в цикле, пока не будет достигнут конец потока (endOfStream).

Метод Close() закрывает поток Rf и освобождает всересурсы, которые были связаны с этим объектом.

 

Класс StreamWriterиз библиотеки классов. NETFramework позволяет создавать в программе новые текстовые файлы и записывать в них текстовые данные, а также добавлять текстовые данные в существующие текстовые файлы.

На рис. 4.10.3-3и рис. 4.10.3-4 представлены процедура записи всей строки в заново созданный текстовый файл и процедура добавления строки в уже существующий файл. Обе процедуры в качестве входных параметров принимают filename(имя файла) и p(строка, содержимое которой записывается в файл).

 

' Процедура записи строки в заново созданный текстовый файл Sub writefile1(ByVal filename AsString, ByVal p AsString) 'проверка существования текстового файла с таким же именем IfFile.Exists(filename)Then MsgBox("Файл "&filename" ужесуществует") ExitSub EndIf 'создание нового текст. файла и потока wf для записи в файл '1 способ 'Dimwf As StreamWriter = File.CreateText(filename) '2 способ Dim wf AsNewStreamWriter(filename) wf.WriteLine(p) 'запись строки в файл wf.Flush() 'очистка буфера потока wf.Close() 'закрытие потока EndSub

Рис. 4.10.3-3

 

' Процедура добавления строки в уже существующий текстовый файл ' Если такого файла нет, то он создается Sub writefile2(ByVal filename AsString, ByVal p AsString) 'проверка существования текстового файла с таким же именем If File.Exists(filename) =FalseThen MsgBox("Файл "&filename&" не существует") EndIf 'создание потока wf для добавления строки в конец файла '1 способ 'Dimwf As StreamWriter = File.AppendText(filename) '2 способ 'Значение True 2-го параметра означает, что будет 'производитьсядозаписьвконецфайла Dim wf AsNewStreamWriter(filename, True) wf.WriteLine(p) 'запись строки в файл wf.Flush() 'очистка буфера потока wf.Close() 'закрытие потока EndSub

Рис. 4.10.3-4

 

При создании потока wf класса StreamWriterвторым способом может использоваться второй аргумент, который определяет способ записи данных в файл. Если этот аргумент равен True, то строка p добавляется в конец файла к уже существующему содержимому. Если второй аргумент равен False или отсутствует, то все содержимое файла (если оно существует) полностью стирается, и с начала файла записывается строка p.

Пространство имен My это средство быстрого доступа, которое упрощает доступ к. NETFramework при выполнении часто встречающихся задач, та­ких, как операции с формами, исследование содержимого компьютера и файловой системы, отображение информации о текущих приложениях или пользователях. С точки зрения пространства имен Myвыглядит примерно как еще одна библиотека классов, которая дублирует в той или иной форме функциональность, уже присутствующую в. NETFramework.

Пространство именMy по функциональности разделено на несколько категорий, которые приведены в таблице 4.10.3-1.

Таблица 4.10.3-1

Объект Описание
My.Application Информация, связанная с текущим приложением, включая заголовок, директории, номер версии.
My.Computer Информация об оборудовании, программном обеспечении и файлах, имеющихся на текущем (локальном) компьютере. My.Computer включает My.Computer.FileSystem, который ис­пользуется для открытия текстовых файлов и зашифрованных файлов системы.
My.Forms Информация о формах текущего проекта Visual Studio.
My.User Информация о текущем активном пользователе из My.Computer.
My.WebServices Информация о веб-службах, активных в My.Computer, и ме­ханизм для доступа к новым веб-службам.

 

Кроме того, пространство именMy это просто способ быстрого доступа к элементам. NETFramework, и все его возможности можно увидеть в окне Программный код (CodeEditor) при помощи технологии IntelliSense. Например, чтобы отобразить окно сообщения, выводящее имя текущего компьютера и имя текущего пользователя, необходимо ввести:

MsgBox(My.User.Name)

 

Эта строка осуществляет вывод, соответствующий рис. 4.10.3-5.

Рис. 4.10.3-5

 

Объект My.Computerможет отображать различную информацию о компьютере и его файлах. Например, следующий оператор отображает текущее системное время (локальная дата и время), определяемое ком­пьютером:

MsgBox(My.Computer. Clock. LocalTime)

 

Чтобы открыть существующий текстовый файл и вывести его содержимое в объект текстового поля, можно использовать объект My.Computer.FileSystemи метод ReadAllText().Программный код будет иметь вид, как на рис. 4.10.3-6.

'Процедура чтения данных из текстового файла 'целиком в одну строку и вывод данных в TextBox Sub vvodFile(ByVal filename AsString, _ ByRef Str AsString, _ ByRef T As TextBox) 'Открываем существующий файл и загружаем его текстовое 'содержимое целиком в одну строку Str Try Str = My.Computer.FileSystem.ReadAllText(filename) T.Text = Str Catch ex As Exception MsgBox("ошибка при чтении файла") EndTry EndSub

Рис. 4.10.3-6

Метод ReadAllText()копирует все содержимое указанного текстового файла в строковую переменную или объект (в данном случае, строковую переменную с именем Str), что с точки зрения производительно­сти и времени написания кода быстрее, чем чтение файла по одной строке с помощью функции LineInput().

Благодаря этому фактору, объект My.Computer.FileSystemпредоставляет великолепный способ быстро запрограммировать часто встречающиеся задачи. Относительно этой новой функции и возможных способов ее применения важно отметить, что здесь объект My.Computer.FileSystemполезен потому, что читается весь текстовый файл. Однако функция LineInput()и класс StreamReaderпредлагают боль­ше возможностей, чем реализация объекта My, и особенно это касается возможности обрабатывать файлы построчно. Эта возможность является очень важной при выполнении сортиров­ки и лексического разбора. Так что лучше всего знать все три метода открытия и создания текстовых файлов. Какой из них будет использоваться при программировании, зависит от ре­шаемой задачи и того, как ваш код будет использоваться.

 

Чтобы создать новый или добавить данные в существующий текстовый файл можно использовать объект My.Computer.FileSystemи метод WriteAllText().Программный код будет иметь вид, как на рис. 4.10.3-7.

'Процедура записи строки в текстовый файл Sub vivodFile(ByVal filename AsString, ByRef Str3 AsString) 'Запись строки-результата Str3 в текстовый файл;значение False 'параметра задает,что файл будет перезаписан. Try My.Computer.FileSystem.WriteAllText(filename, Str3, False) CatchexAsException MsgBox("ошибка при сохранении (создании) файла") EndTry EndSub

Рис. 4.10.3-7

 

В методе WriteAllText()третий аргумент определяет способ записи данных. Если указать True, то данные добавляются в конец, существующих данных файла; если же указать False, то в случае существования каких-то данных в файле, они полностью заменяются новыми данными (файл перезаписывается).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: