Практическая работа по теме Приемы работы с различными источниками данных 1 Задание Элементы управления MainMenu, OpenFileDialog и SaveFileDialog 1




Скачать 329.88 Kb.
страница6/6
Дата14.07.2016
Размер329.88 Kb.
1   2   3   4   5   6

Задание 7. Абстрактный класс Stream для работы с блоками данных

Задача


Использовать объекты классов StreamReader и SteramWriter для считывания и записи информации в текстовый файл.

Решение


Создайте для файла экземпляр класса System.IO.FileInfo и воспользуйтесь его методами CreateText и OpenText, возвращающими объекты классов StreamReader и SteramWriter для считывания и записи информации в текстовый файл.

Обсуждение


В терминах реализации ввода-вывода в программах Stream(поток) – это абстрактный класс, предназначенный для работы с блоками данных. Абстрактный класс System.IO.Stream определяет значительное число членов, которые обеспечивают как синхронное, так и асинхронное взаимодействие со средой хранения данных (файлом на диске или областью в оперативной памяти).

Все классы, производные от Stream, предназначены для работы с блоками данных.

Классы SteramWriter и SteramReader предназначены для считывания и записи символьных данных (данных в формате String). По умолчанию оба эти класса работают с кодировкой Unicode. Проиллюстрируем работу со SteramWriter на примере.

Imports System.IO

Module Module1

Sub Main()

'Укажем имя для нового файла

Dim FileName As String = "c:\1.txt"

'Создадим новый файл

Dim CheckFile As New FileInfo(FileName)

'При создании файла метод Create возвращает объект FileStream для взаимодействия с этим файлом

Dim sw As StreamWriter = CheckFile.CreateText

'Получаем объект StreamWriter и с его помощью записываем в файл несколько строк текста

sw.WriteLine("Первая строка текста")

sw.WriteLine("Вторая строка текста")

sw.WriteLine("Третья строка текста")

Dim i As Integer

For i = 0 To 10

sw.Write(i.ToString & ControlChars.Quote)

Next

'Закрываем StreamWriter, удаление можно закомментировать



sw.Close()

'CheckFile.Delete()

Console.ReadLine()

End Sub


End Module

Если мы откроем созданный нами файл в Notepad, то сможем увидеть результаты записи в текстовый файл (рис. 5.14). Все очень просто. Отметим только, что методы Write() и WriteLine() многократно перегружены, чтобы обеспечивать нам самые разные возможности добавления символьных и числовых данных.

Рис. 5.14. Содержимое файла 1.txt


Самостоятельно


Записывать текстовую информацию в файл мы уже умеем. Осталось научиться такую информацию считывать. Как вы, наверное, уже догадались, сделать вам это придется самостоятельно при помощи класса StreamReader. В качестве помощи перечислим некоторые методы класса StreamReader (табл.3).

Дополните ваше консольное приложение программным кодом. Позволяющим прочитать на экран те строки, которые вы должны были записать в файл методом WriteLine объекта StreamWriter.






Табл. 3.

Наиболее важные методы класса StreamReader




Метод

Описание

Peek()

Возвращает следующий символ, не изменяя позицию указателя в файле.

Read()

Считывает данные из потока на входе.

ReadBlock()

Считывает указанное пользователем количество символов, начиная с определенной позиции, и записывает считанные данные в буфер.

ReadLine()

Считывает строку данных из текущего потока и возвращает ее как значение типа String. Пустая строка (null string) означает конец файла (EOF).

ReadToEnd()

Считывает все символы, начиная с текущей позиции и до конца потока, и возвращает считанные данные как единое значение типа String.

Результат работы написанной вами программы будет выглядеть примерно как на рисунке ниже.

Скорее всего, вы получили объект StreamReader при помощи метода Dim sr As StreamReader = CheckFile.OpenText. Далее вы считываете все строки и выводите их на консоль до того момента, пока не попадается пустая строка (означающая конец файла). Однако все можно сделать проще, если воспользоваться методом ReadToEnd():



Dim str As String = sr.ReadToEnd

Console.WriteLine(str)

sr.Close()



Задание 8. Действия над каталогами

Задача


Требуется удалить, переименовать каталог или проверить его наличие. Или вам нужно кое-что узнать о каталоге, скажем, его атрибуты или дату создания.

Решение


Создайте для каталога экземпляр класса System.IO.DirectoryInfo и воспользуйтесь его свойствами и методами.

Обсуждение


Класс DirectoryInfo во многом похож на класс FileInfo. Он предоставляет те же свойства для получения атрибутов, имен и временных меток файловой системы. Для перемещения, удаления и переименования каталогов в нем используется те же методы, что и в случае файлов (табл.1). Однако DirectoryInfo включает и специфические члены (табл. 4).




Табл. 4.

Члены класса DirectoryInfo




Имя

Описание

Create()

Создает указанный каталог. Если путь включает несколько несуществующих каталогов, все они будут созданы.

Parent, Root

Эти свойства возвращают объект DirectoryInfo, представляющий родительский или корневой каталог соответственно.

CreateSubdirectory

Создает указанный подкаталог в каталоге, определяемом объектом DirectoryInfo, и возвращает для созданного подкаталога новый объект DirectoryInfo.

GetDirectories

Возвращает массив объектов DirectoryInfo, соответствующих всем подкаталогам из данного каталога.

GetFiles

Возвращает массив объектов FileInfo, соответствующий всем файлам из данного каталога.

Рассмотрим на практическом примере фильтрации файлов при помощи знаков подстановки использование объекта класса DirectoryInfo.

Пусть требуется обработать группу файлов, определяемую выражением-фильтром (таким как *.txt или rec03??.bin). Используем перегруженную версию метода DirectoryInfo.GetFiles, принимающую выражение-фильтр.



Imports System.IO

Dim dir1 As New DirectoryInfo("L:\1")

Dim files() As FileInfo

Private Sub Form5_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim f As FileInfo

‘Поиск всех файлов, соответствующих маске *.txt в указанном каталоге

files = dir1.GetFiles("*.txt")

‘Отображение полных имен файлов с помощью элемента управления ListBox

For Each f In files

ListBox1.Items.Add(f.FullName)

Next

End Sub

На рис. 5.15 изображена папка L:\1, в которой имеются файлы с различными расширениями. На рис. 5.16 представлен результат фильтрации файлов перегруженным методом GetFiles().

Рис. 5.15. Содержимое папки L:\1


Рис. 5.16. Результат фильтрации перегруженным методом GetFiles()


Самостоятельно


Создайте собственный браузер для работы с файловой структурой. Допустим, пользователь должен выполнять операции по копированию. Удалению, переименованию файлов в двух каталогах. Спроектируйте интерфейс и напишите программный код, реализующий указанную функциональность. Пример интерфейса – рис. 5.15. Пример программного кода для командной кнопки «Delete» приведен ниже.

Dim dir1 As New DirectoryInfo("L:\1")

Dim dir2 As New DirectoryInfo("L:\2")

Dim files() As FileInfo

Private Sub Form5_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim f As FileInfo

files = dir1.GetFiles("*.*")

For Each f In files

ListBox1.Items.Add(f.FullName)

Next

End Sub


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim s As String = Convert.ToString(ListBox1.SelectedItem)

Dim f As New FileInfo(s)

f.Delete()

dir1.Refresh()

files = dir1.GetFiles("*.*")

ListBox1.DataSource = files

End Sub

Задание 9. Поиск файла, содержащего определенный текст (объект класса FileStream)

Задача


Найти файл, содержащий определенный текст.

Решение


Попытайтесь составить строку поиска соответствия и изучите файл символ за символом, используя метод FileStream.ReadByte.

Обсуждение


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

Функция TestFileForMatch в качестве входных параметров получает объект FileInfo, представляющий собой файл на диске. Объект FileInfo позволяет получить полную информацию об этом файле, кроме того, метод OpenRead объекта FileInfo открывает файл только для чтения и создает объект FileStream. Объект FileStream, в свою очередь, располагает методом ReadByte, считывающим последовательность байтов (или единственный байт) в текущем потоке и перемещает указатель в потоке на количество считанных байтов.

Еще одним входным параметров в функции TestFileForMatch является строка для поиска SearchText. Функция возвращает значение типа Boolean (True в случае успешного поиска, False – в обратном).

Рассмотрим программный код функции для поиска искомого текста в файле:



Private Function TestFileForMatch(ByVal file As FileInfo, ByVal SearchText As String) As Boolean

Dim fs As FileStream = file.OpenRead

Dim Pos As Integer

Dim ch, matchCh As String

Do Until fs.Position = fs.Length

ch = Convert.ToChar(fs.ReadByte)

matchCh = SearchText.Substring(Pos, 1)

If ch <> matchCh = 0 Then

Pos += 1

Else

Pos = 0

End If

If Pos = SearchText.Length - 1 Then

Return True

End If

Loop

fs.Close()

Return False

End Function

Теперь напишем пример использования разработанной функции поиска.

Imports System.IO

Module Module1

Sub Main()

'Укажем имя для нового файла

Dim FileName As String = "c:\1.txt"

'Создадим новый файл

Dim CheckFile As New FileInfo(FileName)

'При создании файла метод Create возвращает объект FileStream для взаимодействия с этим файлом

Dim sw As StreamWriter = CheckFile.CreateText

'Получаем объект StreamWriter и с его помощью записываем в файл несколько строк текста

sw.WriteLine("Первая строка текста find")

sw.WriteLine("Вторая строка текста")

sw.WriteLine("Третья строка текста")

Dim i As Integer

For i = 0 To 10

sw.Write(i.ToString & ControlChars.Quote)

Next

'Закрываем StreamWriter

sw.Close()

Console.ReadLine()

If TestFileForMatch(CheckFile, "find") Then

Console.WriteLine("Найдено")

Else

Console.WriteLine("Не найдено")

End If

Console.ReadLine()

End Sub

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

Самостоятельно


Используя функцию поиска TestFileForMatch(), спроектируйте Windows интерфейс для ее тестирования.

Задание 10. Рекурсивная обработка файлов

Задача


Выполнить некоторое действие над всеми файлами из текущего каталога и любых его подкаталогов.

Решение


Используйте рекурсивный вызов метода DirectoryInfo.GetFiles для получения списка файлов, находящихся в данном каталоге и всех его подкаталогах.

Обсуждение


Классы Directory и DirectoryInfo включают метод GetFiles, который получает файлы, находящиеся в текущем каталоге. Эти классы имеют также метод GetDirectories, получающий список подкаталогов. Для полной обработки дерева каталогов можно рекурсивно вызвать метод GetDirectoties.

Этот способ реализован в процедуре SearchDirectory(), код которой представлен ниже. Процедура SearchDirectory() добавляет все файлы, соответствующие конкретному шаблону, в объект Matches, представляющий собой объект класса ArrayList, после чего рекурсивно вызывает себя для каждого подкаталога.

Найденные файлы, соответствующие указанной маске, помещаются в массив ArrayList. Вы может использовать любую другую структуру для хранения файлов (обычный массив, стэк, хэш-таблицу).

Private Sub SearchDirectory(ByVal dir As DirectoryInfo)

'Получение файлов, находящихся в данном каталоге

Dim FileItem As FileInfo

For Each FileItem In dir.GetFiles(FilterStr)

'Если файл соответствует шаблону, он добавляется в набор Matches, являющийся объектом класса ArrayList (вы можете использовать любую другую структуру)

Matches.Add(FileItem)

Next

'Обработка подкаталогов



If Recurs Then

Dim DirItem As DirectoryInfo

For Each DirItem In dir.GetDirectories

SearchDirectory(DirItem)

Next

End If


End Sub

На рис. 5.17 показ результат поиска текстовых файлов во всех подкаталогах диска C:\.

Рис. 5.17. Результат рекурсивной обработки каталога C:\


Самостоятельно


  1. Создайте в главном меню вашей MDI-формы пункт «Рекурсивная обработка каталогов».

  2. Добавьте форму, интерфейс которой будет состоять из элемента управления ListBox и командной кнопки для отображения результатов рекурсивной обработки указанного каталога и все его подкаталогов.

  3. При программировании процесса поиска файлов можно использовать приведенную выше процедуру рекурсивной обработки каталогов.
1   2   3   4   5   6


База данных защищена авторским правом ©uverenniy.ru 2016
обратиться к администрации

    Главная страница