Практическая работа по теме 5. Приемы работы с различными источниками данных

advertisement
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Практическая работа по теме 5. Приемы работы с
различными источниками данных
Элементы управления MainMenu, OpenFileDialog и SaveFileDialog.
Чтение данных из текстовых файлов. Запись данных в текстовые
файлы. Работа с типизированными файлами. Использование не
типизированных файлов (файлов последовательного доступа).
Действия над файлами. Абстрактный класс Stream для работы над
блоками данных. Действия над каталогами. Поиск файла,
содержащего определенный текст (объект класса FileStream).
Рекурсивная обработка файлов.
Практическая работа по теме 5. Приемы работы с различными источниками данных .........1
Задание 1. Элементы управления MainMenu, OpenFileDialog и SaveFileDialog .................1
Задание 2. Чтение данных из текстового файла .....................................................................5
Задание 3. Запись данных в текстовый файл ..........................................................................9
Задание 4. Работа с типизированными файлами ..................................................................11
Задание 5. Использование не типизированных файлов (файлов последовательно
доступа) ....................................................................................................................................16
Задание 6. Действия над файлами..........................................................................................20
Задание 7. Абстрактный класс Stream для работы с блоками данных ...............................24
Задание 8. Действия над каталогами .....................................................................................27
Задание 9. Поиск файла, содержащего определенный текст (объект класса FileStream) 30
Задание 10. Рекурсивная обработка файлов .........................................................................32
При создании полноценных приложений обычно необходимо
обеспечить возможность сохранять результаты трудов пользователя в
перерывах между сеансам работы. Платформа Microsoft.NET
предоставляет программистам богатый набор объектов, позволяющих
получать информацию о файловой системе, перемещать и удалять
файлы и каталоги, создавать текстовые и двоичные файлы и даже
следить за изменением конкретных каталогов. Среди инструментария
для работы с файлами и папками в .NET имеются стандартные
элементы управления, классы и общие методы.
Задание 1. Элементы управления MainMenu, OpenFileDialog и
SaveFileDialog
Задача
Исследовать функциональность элементов управления MainMenu,
OpenFileDialog и SaveFileDialog, предназначенных для формирования
многодокументных приложений (MDI – multi document interface).
Решение
Сконструировать
MDI-приложение
с
применением
элемента
MainMenu. Использовать метод ShowDialog элементов OpenFileDialog
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
и SaveFileDialog, свойства FileNames, Filter, InitialDirectory, MultiSelect,
позволяющие организовать диалог пользователя при выборе папок и
файлов.
Обсуждение
Элемент управления MainMenu предназначен для создания в
приложении главного меню (рис. 5.1). Чтобы создать главное меню,
прежде всего, необходимо разместить один элемент типа MainMenu
на форме приложения. При этом на самой форме элемент не
отображается, но под ней появляется область, содержащая значок
элемента MainMenu.
Рассмотрим технологию работы с дочерними формами MDI (Multi
Document Interface) приложения.
1. У родительской формы следует установить свойство
Me.IsMDIContainer=TRUE (по умолчанию свойство равно False).
Форма после установления свойства в значение True изменит
свой внешний вид, теперь это контейнер, содержащий только
другие формы, но не собственные элементы управления.
2. Добавить в форму элемент управления MainMenu.
3. В меню родительской создать пункт (например, Windows) из
которого можно будет открывать дочерние окна, и управлять их
расположением (рис.5.1).
Рис. 5.1. Меню MDI-приложения
4. Для того чтобы список заголовков открытых окон автоматически
формировался в пункте Windows необходимо установить у
пункта меню Windows свойство MDIList=True. В этом случае
меню будет выглядеть как на рис. 5.2.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 5.2. Открытые окна MDI-приложения
5. Для каждого пункта меню, открывающего соответствующее
дочернее окно, ввести в процедуру обработки следующий код:
Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MenuItem2.Click
Dim f1 As New Form1
f1.MdiParent = Me
f1.Show()
End Sub
6. Упорядочивание
открытых дочерних окон
выполняется
установкой соответствующего свойства у метода MDI-формы
LayoutMdi. Пример установки одного из свойств (для
расположения окон каскадом – MdiLayout.Cascade) приведен
ниже.
Private Sub MenuItem7_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MenuItem7.Click
Me.LayoutMdi(MdiLayout.Cascade)
End Sub
Самостоятельно
Сконструируйте MDI-приложение, состоящее из родительской формы
с главным меню и нескольких дочерних окон, которые открываются из
соответствующих пунктов главного меню. В меню необходимо
реализовать возможность автоматической организации списка
заголовков открытых окон, расположения открытых окон всеми
возможными способами (каскадом, без перекрытия, горизонтально,
вертикально).
Элементы
управления
OpenFileDialog
и
SaveFileDialog
предназначены для отображения стандартных диалоговых окон
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
открытия и сохранения файлов. Объекты типа OpenFileDialog и
SaveFileDialog, как и другие не визуальные элементы управления, во
время разработки отображаются в специальной области под формой
приложения (туда их должен разместить программист).
При вызове метода ShowDialog() диалоговое окно активизируется.
Если пользователь отменяет операцию работы, с диалоговым окном
нажав клавишу Cancel (Отмена), то метод возвращает значение
DialogResult.Cancel. Если операция заканчивается успешно, то имя
открываемого (сохраняемого) файла записывается в качестве
значения свойства FileName объекта OpenFileDialog (SaveFileDialog),
метод ShowDialog() возвращает значение DialogResult.Ok.
Приведем пример кода, учитывающего эту ситуацию:
Dim File as string
if OpenFileDialog1.ShowDialog()=DialogResult.OK then
File=OpenFileDialog1.FileName
В переменной File содержится строка, представляющая полное имя
выбранного пользователем файла.
Часто встречается ситуация, когда пользователю разрешается
выбрать не один, а несколько файлов, например, для копирования или
удаления (свойство OpenFileDialog1.MultiSelect=True). В этом
случае, имена всех выбранных пользователем файлов сохраняются в
свойстве-массиве FileNames(), который можно читать с помощью
цикла, например For ..next (элементы нумеруются с нуля).
Свойство MultiSelect можно установить программным образом или в
конструкторе формы в списке свойств элемента OpenFileDialog1.
Таким же образом (в коде программы или в списке свойств объекта)
можно
установить
свойство
Filter,
например,
SaveFileDialog.Filter=”текстовые файлы|*.txt|другие документы|*.doc”.
Это свойство позволит просматривать только файлы указанного типа.
Самостоятельно
В одной из форм MDI приложения, созданного в предыдущем задании,
поместите пункт меню, позволяющий выбирать файлы (OpenFile) для
просмотра. Список выбранных пользователем файлов формируйте в
элементе List, помещенном в форме (рис. 5.3). Установите свойство
OpenFileDialog=True и организуйте запись в список одновременно
всей группы выбранных файлов. Используйте свойство InitialDirectory
для установки начального каталога при просмотре.
Добавьте в меню поиск отдельно текстовых файлов, отдельно
графических. Программным способом установите соответствующие
фильтры для элемента OpenFileDialog.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
На рис. 5.3 показан пример формирования динамического главного
меню (пункты меню появляются по мере необходимости). Этот
эффект достигается, если при выборе одного из пунктов меню другие
сделать невидимыми. Доступность меню регулируется свойством
Visible объекта MenuItem (значения True или False).
Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MenuItem2.Click
Dim fr As New Form4
fr.MdiParent = Me
fr.Show()
MenuItem1.Visible = False
End Sub
Рис. 5.3. Динамическое главное меню
Задание 2. Чтение данных из текстового файла
Задача
Рассмотреть стандартные средства VB.NET для чтения данных из
текстовых файлов, состоящих из строк разной длины, отделенных
друг от друга двумя специальными символами – возвратом каретки и
переводом строки.
Решение
Использовать процедуры FileOpen, LineInput, Input, FileClose для
выполнения операций по открытию, чтению и закрытию текстового
файла.
Обсуждение
Файлы, состоящие из строк разной длины, которые отделяются друг
от друга символами возврата каретки и перевода строк принято
называть текстовыми файлами.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Для работы с текстовыми файлами VB.NET располагает
стандартными средствами: процедурами, функциями, встроенными
диалоговыми окнами.
Перед началом работы с файлом, его нужно открыть с помощью
процедуры FileOpen, эта процедура связывает текущее имя файла с
файловым номером. Файловым номером является целое число,
используемое для идентификации файла. Синтаксис процедуры
имеет следующий вид:
FileOpen (filenumber, filename, [workmode], [OpenAccess],
[OpenShare], [RecordLength]),
где
 filenumber – целый положите файловый номер;
 filename – имя файла;
 workmode – режим работы; для текстовых файлов этот параметр
может быть равен OpenMode.Input (для чтения),
OpenMode.Output (для записи), OpenMode.Append (для
добавления в конец файла),
 OpenAccess – режим доступа, необязательный параметр,
определен по умолчанию;
 OpenShare – режим совместного использования файла
приложениями, необязательный параметр, определяется по
умолчанию;
 RecordLength – длина записи в байтах для типизированного
файла, необязательный параметр.
После окончания работы с файлом его следует закрыть при помощи
процедуры FileClose (filenumber), где filenumber – файловый номер,
присвоенный файлу при его открытии процедурой FileOpen.
Процедуры ввода–вывода в файлы в Visual Basic позволяют читать и
записывать последовательные текстовые данные. Для чтения
текстовых данных из файла нужно открыть файл с помощью
процедуры
FileOpen (filenumber, filename, OpenMode.Input)
Если файл открыт для чтения, то извлечь из него информацию можно
при помощи процедуры Input() или функции LineInput().
Функция LineInput() записывает очередную строку из входного файла
filenumber в переменную variable. Синтаксис функции следующий:
variable = LineInput(filenumber).
Процедура Input (filenumber, variable) позволяет считать из
текстового файла значения, разделенные запятыми. Она записывает
очередную последовательность символов из входного файла в
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
переменную variable, пока не встретилась запятая или пара символов
возврат каретки/перевод строки.
Для отображения данных, прочитанных из текстового файла, можно
использовать элемент управления TextBox с предварительной его
настройкой (рис. 5.4). Свойство MultiLine=True позволяет отображать
более одной строки одновременно, свойство Anchor позволяет
зафиксировать синхронность изменения размеров текстового окна при
изменении размеров окна формы. Свойство Anchor устанавливается
щелчками мыши по соответствующим сторонам окна (см. установку на
рис. 5.4).
Рис. 5. 4. Установление свойств элемента TextBox
Можно также воспользоваться другим элементом управления
RichTextBox, который имеет большую функциональность по
отношению TextBox.
Самостоятельно
Создайте в Блокноте текстовый файл, состоящий из нескольких строк
различной длины. Конец строки фиксируйте нажатием клавиши Enter
(другими словами, создайте несколько абзацев текста).
В одной из дочерних форм вашего MDI-приложения поместите
элемент управления для отображения данных, прочитанных из
текстового файла, например, элемент управления RichTextBox.
В меню дочернего окна добавьте команды для чтения файла в режиме
LineInput и Input.
Пример чтения текстового файла в режиме Input приведен ниже.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MenuItem2.Click
Dim fname, s As String
If OpenFileDialog1.ShowDialog = DialogResult.OK Then fname =
OpenFileDialog1.FileName
FileOpen(1, fname, OpenMode.Input)
Do While Not EOF(1) 'пока весь входной файл не прочитан
Input(1, s) 'считывание из файла 1 строки или части строки до запятой
RichTextBox1.Text &= s & ControlChars.CrLf 'вывод прочитанных строк
в текстовое окно
'CrLf – константа, аналог chr(10) + chr(13) (символы возврата каретки и
переноса строки)
Loop
FileClose(1) 'закрыть файл
End Sub
Функция EOF (filenumber) возвращает True, если достигнут конец
файла с номером filenumber, и False в противном случае.
Сравните содержимое файла в Блокноте (рис. 5.5) и результат чтения
файла процедурой Input (рис. 5.6).
Чтение текстового файла с помощью функции LineInput выполните
самостоятельно (рис. 5.7). Сравните полученные результаты и
объясните причину расхождений. В каких случаях следует
использовать процедуру Input? Для какой структуры текстового файла
удобнее использовать функцию LineInput?
Рис. 5.5. Содержание файла в программе Блокнот
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 5.6. Текстовый файл в Блокноте и в окне RichTextBox, прочитанный методом Input
Рис. 5.7. Текстовый файл, прочитанный методом LineInput
Задание 3. Запись данных в текстовый файл
Задача
Рассмотреть стандартные средства VB.NET для записи данных в
текстовые файлы. Данные представляют собой строки разной длины,
отделенные друг от друга двумя специальными символами –
возвратом каретки и переводом строки.
Решение
Использовать стандартные процедуры FileOpen(), Print(), PrintLine(),
FileClose() для выполнения операций по открытию, записи и закрытию
текстового файла.
Обсуждение
Для записи в файл текстовых строк файл должен быть открыт для
записи методом FileOpen(), но с другим значением параметра
WorkMode: OpenMode.Output при создании нового файла или
OpenMode.Append для до записи в конец существующего файла:
FileOpen(filenumber, filename, OpenMode.Output)
FileOpen(filenumber, filename, OpenMode.Append).
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Не путайте режимы OpenMode.Output и OpenMode.Append. Если вы
откроете существующий файл в режиме OpenMode.Output, то все его
старое содержимое будет уничтожено! Возможно, вы именно этого и
хотите, но если ваша задача – дописать что-то в конец файла, то
следует использовать режим OpenMode.Append.
Для записи данных в текстовый файл используются процедуры Print()
и PrintLine(). Синтаксис процедур следующий:
Print(filenumber, var)
PrintLine(filenumber, var)
Конструкции означают – «записать строку из переменной var в файл с
номером «filenumber». Процедура PrintLine() отличается от Print() тем,
что вставляет после значения var символы – возврат каретки и
перевод строки. Таким образом, код
Print(1, “ABC”)
Print(1, “DEF”)
выведет в файл с номером 1 строку ABCDEF, а код –
PrintLine (1, “ABC”)
PrintLine (1, “DEF”)
выведет две отдельные строки – ABC и DEF.
После окончания работы с файлом его следует закрыть при помощи
процедуры FileClose(filenumber), где filenumber – файловый номер,
присвоенный файлу при его открытии процедурой FileOpen.
Самостоятельно
Продолжим работу с приложением, созданным в задании 1. Добавьте
в меню формы для чтения текстовых файлов команды для сохранения
файла в режиме PrintLine и Print. Для указания имени файла
используйте стандартный диалог SaveFileDialog (не забудьте
переместить соответствующий элемент управления в форму).
Проверьте,
как
работают
константы
OpenMode.Output
и
OpenMode.Append. Используйте для этого разные пункты в меню.
В качестве примера ниже приведен код записи в текстовый файл
методом PrintLine.
Private Sub MenuItem4_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MenuItem4.Click
Dim fname As String
If SaveFileDialog1.ShowDialog = DialogResult.OK Then fname =
SaveFileDialog1.FileName
FileOpen(1, fname, OpenMode.Output)
PrintLine(1, RichTextBox1.Text())
FileClose(1)
End Sub
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Задание 4. Работа с типизированными файлами
Задача
Рассмотреть стандартные средства VB.NET для записи данных в
типизированные файлы, состоящих из набора однотипных записей.
Решение
Использовать процедуры FileOpen, FileGetObject, FilePutObject,
FileClose для выполнения операций по открытию, записи и закрытию
типизированного файла.
Обсуждение
Типизированные файлы состоят из набора однотипных записей. Для
открытия типизированного файла в качестве режима работы
необходимо указать OpenMode.Random (и для чтения, и для записи).
Кроме того, можно задать значение необязательного параметра
RecordLength. Параметр RecordLength – размер записи в байтах, из
которых состоит файл. Оператор, открывающий типизированный
файл должен иметь следующую структуру
FileOpen(filenumber, filename, workMode, OpenAccess, OpenShare,
RecordLength),
три
последних
параметра
являются
необязательными, синтаксис может быть сокращен до указания
только обязательных параметров:
FileOpen(filenumber, filename, OpenMode.Random), но лучше все
параметры, особенно длину записи указывать явно, например:
FileOpen(1, "L:\2.dat", OpenMode.Random, OpenAccess.Write,
OpenShare.Default, 39).
При работе с типизированными файлами для чтения и записи данных
используются процедуры FileGetObject() и FilePutObject(). Синтаксис
этих процедур следующий:
FileGetObject(filenumber,var, recnumber) – чтение записи из
типизированного файла;
FilePutObject(filenumber, var, recnumber) – запись в типизированный
файл, где
Filenumber – целый положительный файловый номер, назначается
программистом,
удаляется
при
закрытии
файла
методом
FileClose(filenumber);
Var – переменная для записи строки типизированного файла;
Recnumber – номер записи в файле, первая запись имеет номер 1,
вторая – 2, и так далее; лучше если номер записи создается
программистом явным образом.
Процедура FileGetObject() считывает в переменную var запись с
номером recnumber из входного файла filenumber (первая запись
имеет номер 1).
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Процедура FilePutObject() записывает в файл значение переменной
var. Если параметр recnumber не указан, то операция будет
производиться с текущей записью.
Рассмотрим практический пример использования типизированных
данных. Напишем простейшую программу, которая иллюстрирует
обычное применение типизированного файла – хранение картотеки
туристического агентства, состоящей из одинаковых по своей
структуре записей. Ограничимся тремя функциями: добавлением
любой записи в картотеку; просмотром любой записи по введенному
номеру, последовательным перебором записей.
Пусть картотека хранит следующую информацию о туристе: фамилию
туриста, пол, возраст, выбранный тур (рис. 5.8). Типизированная
запись представляет собой набор следующих полей: фамилия – 20
символов, пол – 1 символ, возраст – 2 символа, название тура – 10
символов.
В документации по VB.NET сказано, что при записи строки в файл
методом FilePutObject() происходит добавление к каждой записи еще
четырех служебных символов. Таким образом, длина каждой записи в
нашем файле 33+4=37 символов.
В рассмотренном ниже примере для хранения списка туров
используется обычный текстовый файл, в каждой строке которого
хранится название тура. Список отображается в приложении с
помощью элемента управления ComboBox. Чтение из файла
выполняется
методом
LineInput(),
который
распознает
последовательность символов: конец строки и перевод каретки, как
символы разделения строк. Таким образом, длина записи в нашем
файле 37+2=39 символов (2 символа появились в записи за счет
символов конца строки и перевода каретки, которые имеются в каждой
строке текстового файла с названиями туров).
Рис. 5.8. Проектирование интерфейса приложения
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Теперь рассмотрим код приложения подробнее. Объявим глобальную
(на уровне формы) переменную для хранения текущего номера
записи:
Dim number As Integer
Private Sub Form4_Load(ByVal
sender As System.Object, ByVal e
As System.EventArgs) Handles
MyBase.Load
FileOpen(1, "L:\1.txt",
OpenMode.Input)
Dim s As String
While Not EOF(1)
s = LineInput(1)
ComboBox1.Items.Add(s)
End While
FileClose(1)
End Sub
В текстовом файле (здесь L:\1.txt) хранится информация о названиях
туров. Отображение данных о турах выполняется с помощью
ComboBox.
Код для командной кнопки «Добавить» выглядит следующим образом:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim str, s As String
s = TextBox1.Text
str = s + Space(20 - s.Length)
If RadioButton1.Checked Then str &= "ж" Else str &= "м"
str &= TextBox2.Text
s = ComboBox1.SelectedItem
str &= s + Space(10 - s.Length)
FileOpen(1, "L:\2.dat", OpenMode.Random, OpenAccess.Write,
OpenShare.Default, 39)
FilePutObject(1, str, 1 + LOF(1) / 39) ' Длина записи + 4 при записи
строки +2 от строки из списка
FileClose(1)
TextBox1.Text = ""
TextBox2.Text = ""
ComboBox1.SelectedIndex = -1
FileClose(1)
End Sub
В этом обработчике события вам не знакомы две функции: Space() и
LOF(). Название функции Space (пробел) показательно, функция
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
создает указанное число пробелов: Space(20 - s.Length) – в данном
случае столько, сколько не хватает до числа 20. Этот прием позволяет
дополнить строку с введенной фамилией до 20 символов (поле имеет
фиксированную длину, мы договорились, что для хранения фамилии
длина поля будет 20 символов).
Еще одна незнакомая функция – LOF (length of file – длина файла) –
возвращает длину указанного файла в байтах.
Разберем программный код для записи сформированной строки в
файл: FilePutObject(1, str, 1 + LOF(1) / 39).
Первые два параметра метода указывают номер файла, открытого
для записи и переменную, в которой хранится строка для записи в
файл.
Третьим параметром является номер записи, формируемый явным
образом: функция LOF(1) возвращает длину файла (в байтах),
разделив эту длину на длину записи (у нас, 39) мы получим число
записей в файле. Новая запись, естественно, будет больше на 1, чем
последняя запись файла.
Таким образом, происходит запись данных в файл. Данные при этом
имеют фиксированную структуру, как для каждого поля, так и для всей
записи (рис. 5. 9).
Рис. 5.9. Структура типизированного файла
Рассмотрим код командной кнопки «Просмотреть по номеру».
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button4.Click
Dim str As String
Dim n As Integer = CType(TextBox3.Text, Integer)
FileOpen(1, "L:\2.dat", OpenMode.Random, OpenAccess.Read,
OpenShare.Default, 39)
If n > (LOF(1) / 39) Then number = 1
FileGetObject(1, str, n)
FileClose(1)
Label5.Text = str.Substring(0, 19)
If str.Substring(20, 1) = "ж" Then RadioButton3.Checked = True Else
RadioButton4.Checked = True
Label7.Text = str.Substring(21, 2)
Label9.Text = str.Substring(23, 10)
End Sub
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Остается рассмотреть программные коды для кнопок, выполняющих
перебор записей файла вперед и назад (без указания конкретного
номера записи). Для перемещения на каждую следующую запись:
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button3.Click
Dim str As String
FileOpen(1, "L:\2.dat", OpenMode.Random, OpenAccess.Read,
OpenShare.Default, 39)
If number <= (LOF(1) / 39) Then number += 1 Else number = 1
FileGetObject(1, str, number)
FileClose(1)
Label5.Text = str.Substring(0, 19)
If str.Substring(20, 1) = "ж" Then RadioButton3.Checked = True Else
RadioButton4.Checked = True
Label7.Text = str.Substring(21, 2)
Label9.Text = str.Substring(23, 10)
End Sub
Для обратного перемещения:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
Dim str As String
FileOpen(1, "L:\2.dat", OpenMode.Random, OpenAccess.Read,
OpenShare.Default, 39)
If number <= 1 Then number = 1 Else number -= 1
FileGetObject(1, str, number)
FileClose(1)
Label5.Text = str.Substring(0, 19)
If str.Substring(20, 1) = "ж" Then RadioButton3.Checked = True Else
RadioButton4.Checked = True
Label7.Text = str.Substring(21, 2)
Label9.Text = str.Substring(23, 10)
End Sub
Окончательный вид приложения показан на рис. 5. 10.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 5.10. Приложение «Туристическая фирма»
Самостоятельно
Внесите дополнительную информацию о туристе: наличие/отсутствие
загранпаспорта, едет один или с детьми, сданы/ не сданы фотографии
на визу, сроки и стоимость тура, вычисление полной стоимости тура
со стоимостью визы и медицинской страховкой (один день – один
евро).
Задание 5. Использование не типизированных файлов (файлов
последовательно доступа)
Задача
Рассмотреть стандартные средства VB.NET для записи данных в не
типизированные файлы, состоящих из набора записей разной длины.
Решение
Использовать процедуры FileOpen, FileGetObject, FilePutObject,
FileClose для выполнения операций по открытию, записи и закрытию
не типизированного файла.
Обсуждение
Не всегда файл имеет какую-либо ярко выраженную внутреннюю
структуру. Нередко ее нет вовсе или же она нас мало интересует. Есть
и другие причины использовать не типизированные файлы. К примеру,
наша картотека обладает одной особенностью: каждая карточка,
хранимая в типизированном файле, занимает 39 байт независимо от
реального размера. Такой способ хранения нельзя назвать экономным
– в итоге существенная часть файла может расходоваться впустую.
Зато доступ к любой записи осуществляется очень просто, поскольку
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
все записи имеют одинаковый размер вычислить положение записи в
файле нетрудно.
Если же время доступа к записи для вас не имеет принципиального
значения, а место на диске расходовать понапрасну не хотелось бы,
можно воспользоваться не типизированными файлами. При этом,
однако, чтобы прочесть какую-либо запись, нам придется заодно
прочесть все записи, предшествующие требуемой. Поэтому такие
файлы называют файлами последовательно доступа.
С точки зрения программирования работа с не типизированными
файлами очень похожа на работу с типизированными файлами.
При работе с файлами последовательного доступа в качестве режима
работы при открытии файла указывается OpenMode.Binary, а чтение
и запись производится при помощи уже хорошо известных процедур:
FileGetObject (filenumber,var)
FilePutObject (filenumber, var, смещение)
При этом значение параметра «смещение» будет обозначать
смещение в байтах от начала файла, а не номер записи. Самая
первая запись имеет смещение 1, смещение каждой последующей
можно вычислить по следующей формуле: 1+LOF(filenumber).
Перепишем теперь программу с картотекой с использованием не
типизированного файла. Все интерфейсные элементы, конечно,
останутся без изменения, необходимо только добавить парные
командные кнопки для выполнения тех же операций записи и чтения,
но для файла другой структуры. Пример измененного интерфейса
представлен на рис. 5.11.
Модифицированная процедура записи в файл выглядит следующим
образом:
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button5.Click
Dim str As String
FileOpen(1, "L:\22.dat", OpenMode.Binary)
FilePutObject(1, TextBox1.Text, 1 + LOF(1))
If RadioButton1.Checked Then str = "ж" Else str = "м"
FilePutObject(1, str, 1 + LOF(1))
FilePutObject(1, TextBox2.Text, 1 + LOF(1))
FilePutObject(1, ComboBox1.SelectedItem, 1 + LOF(1))
FileClose(1)
TextBox1.Text = ""
TextBox2.Text = ""
ComboBox1.SelectedIndex = -1
End Sub
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Обратите внимание, что запись отдельных полей в файл
производится без лишних пробелов, подряд, что позволяет не хранить
не нужную информацию.
Рис. 5.11.Измененный интерфейс картотеки
Модифицированная процедура для просмотра записей из файла
(командная кнопка Просмотреть по смещению) выглядит так:
Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button6.Click
Dim fio, gender, pAge, country As String
Dim n As Integer = CType(TextBox3.Text, Integer)
Dim i As Integer
FileOpen(1, "L:\22.dat", OpenMode.Binary)
For i = 1 To n
FileGetObject(1, fio)
FileGetObject(1, gender)
FileGetObject(1, pAge)
FileGetObject(1, country)
Next
FileClose(1)
Label5.Text = fio
If gender = "ж" Then RadioButton3.Checked = True Else
RadioButton4.Checked = True
Label7.Text = pAge
Label9.Text = country
End Sub
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Модифицированная процедура для просмотра записей из файла
(командная кнопка >>) выглядит так:
Dim number As Integer
Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button7.Click
Dim fio, gender, pAge, country As String
Dim i As Integer
FileOpen(1, "L:\22.dat", OpenMode.Binary)
number += 1
For i = 1 To number
FileGetObject(1, fio)
FileGetObject(1, gender)
FileGetObject(1, pAge)
FileGetObject(1, country)
Next
FileClose(1)
Label5.Text = fio
If gender = "ж" Then RadioButton3.Checked = True Else
RadioButton4.Checked = True
Label7.Text = pAge
Label9.Text = country
End Sub
Модифицированная процедура для просмотра записей из файла
(командная кнопка <<) выглядит так:
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Dim number As Integer
Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button8.Click
Dim fio, gender, pAge, country As String
Dim i As Integer
FileOpen(1, "L:\22.dat", OpenMode.Binary)
number -= 1
For i = 1 To number
FileGetObject(1, fio)
FileGetObject(1, gender)
FileGetObject(1, pAge)
FileGetObject(1, country)
Next
FileClose(1)
Label5.Text = fio
If gender = "ж" Then RadioButton3.Checked = True Else
RadioButton4.Checked = True
Label7.Text = pAge
Label9.Text = country
End Sub
Самостоятельно
Добавьте в ваше приложение (с дополнительной информацией о
туристе) возможность работы с не типизированным файлом.
Самостоятельно*
В процедурах последовательного перемещения по записям не
типизированного файла нет проверок на допустимость смещения как
вперед, так и обратно. Введите соответствующие ограничения.
Задание 6. Действия над файлами
Задача
Требуется удалить, переименовать файл или проверить его наличие.
Или вам нужно кое-что узнать о файле, скажем, его атрибуты или дату
создания.
Решение
Создайте для файла экземпляр класса
воспользуйтесь его свойствами и методами.
System.IO.FileInfo
и
Обсуждение
Для создания объекта FileInfo нужно просто указать в его конструкторе
относительный или полностью определенный путь к файлу, причем
сам файл может не существовать. Пространство имен System.IO
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
удобнее импортировать в заголовке модуля. После того, как объект
класса FileInfo создан, вы можете задействовать свойства и методы
объекта для получения полной информации о файле или можете
выполнять над ним всевозможные действия.
В задании 7 вы поработаете еще с одним классом DirectoryInfo, этот
класс выполняет действия над каталогами, имеет очень похожие
свойства и методы с классом FileInfo. В табл. 1. приведены свойства и
методы этих классов, в табл. 2. приведены свойства и методы,
входящие в состав только класса FileInfo.
Табл.1.
Общие члены классов FileInfo и DirectoryInfo
Имя
Exists
Описание
Возвращает True или False в зависимости от того,
существует ли файл/каталог в указанном месте.
Attributes
Возвращает одно или более значений перечисления
FileAttributes,
представляющего
атрибуты
файла/каталога.
CreationTime,
Эти свойства возвращают экземпляр DateTime,
LastAccessTime, определяющий соответственно время создания,
LastWriteTime
время последнего доступа и время последнего
обновления файла/каталога.
FullName,
Эти свойства возвращают строку. Представляющую
Name,
соответственно полностью определенное имя
Extension
каталога/файла,
имя
каталога/файла
(с
расширением) и только расширение.
Delete
Удаляет файл/каталог, если таковой существует.
Каталог, содержащий другие каталоги, можно
удалить
перегруженным
методом
Delete,
принимающим параметр recursive, передав в
качестве этого параметра True.
Refresh
Обновляет объект FileInfo или DirectoryInfo так,
чтобы он был синхронизирован с любыми
изменениями файловой системы, происшедшими с
момента его создания (такими как изменение
атрибута файла при помощи Windows Explorer, то
есть вручную).
MoveTo
Копирует каталог со всем содержимым или просто
файл. В случае объекта DirectoryInfo вы должны
указать новый путь. В случае объекта FileInfo нужно
указать путь и имя файла. Кроме того, метод
MoveTo позволяет переименовывать файл/каталог
без изменения его расположения.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Большинство возможностей, обеспечиваемых объектом FileInfo,
доступно и через общие (shared) методы класса File. Как правило,
класс FileInfo следует использовать, когда вы хотите получить более
одного фрагмента информации за раз, потому что этот класс
выполняет проверку безопасности один раз (при создании экземпляра
класса FileInfo). А не при каждом вызове метода. Кроме того, объект
не имеет свойства Length.
Табл.2.
Члены класса FileInfo
Имя
Length
DirectoryName,
Directory
CopyTo
Create,
CreateText
Open,
OpenRead,
OpenText,
OpenWrite
Описание
Возвращает размер файла в байтах.
Свойство
DirectoryName
возвращает
имя
родительского каталога, в котором находится данный
файл, а свойство Directory – полный объект
DirectoryInfo, представляющий родительский каталог
и
позволяющий
получить
более
подробную
информацию о нем.
Копирует файл, принимая в качестве параметра
новый путь и новое имя файла, и возвращает новый
объект
FileInfo,
соответствующий
новому
(скопированному)
файлу.
Для
разрешения
перезаписи файла можно указать дополнительный
необязательный параметр True.
Метод Create создает указанный файл и возвращает
объект FileStream, который можно использовать для
записи данных в файл. Метод CreateText делает то
же самое, но возвращает объект StreamWriter,
играющий роль оболочки для потока.
Эти методы открывают файл (если он существует).
OpenRead и OpenText открывают файл только для
чтения, возвращая соответственно объект FileStream
или StreamReader. OpenWrite открывает файл только
для записи, возвращая объект FileStream.
Самостоятельно
Создайте консольное приложение, позволяющее выводить сведения о
файле, указанном в качестве аргумента в конструкторе объекта
класса FileInfo. Пример работы такого приложения приведен на рис.
5.12.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 5.12. Пример приложения для отображения информации о файле
При помощи класса FileInfo мы можем просто и удобно создавать
новый файл в файловой системе (рис. 5.13):
Imports System.IO
Module Module1
Sub Main()
'Укажем имя для нового файла
Dim FileName As String = "c:\1.txt"
'Создадим новый файл
Dim CheckFile As New FileInfo(FileName)
'Оъект FileInfo, созданный для файла, имя которого указано в качестве
входного параметра в конструкторе, позволяет использовать его
методы и свойства. Метод CreateText() возвращает объект
StreamWriter для взаимодействия с этим файлом: для записи
текстовых данных в новый файл
Dim sw As StreamWriter = CheckFile.CreateText
'Выводим основную информацию о созданном нами файле
Console.WriteLine("Тестируемый файл " & CheckFile.Name)
Console.WriteLine("В каталоге " & CheckFile.DirectoryName)
Console.WriteLine("Файл существует " & CheckFile.Exists.ToString)
If CheckFile.Exists Then
Console.Write("Файл создан ")
Console.WriteLine(CheckFile.CreationTime.ToString)
Console.Write("Последнее обновление ")
Console.WriteLine(CheckFile.LastWriteTime.ToString)
Console.Write("Последний доступ ")
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Console.WriteLine(CheckFile.LastAccessTime.ToString)
Console.Write("Размер файла в байтах ")
Console.WriteLine(CheckFile.Length.ToString)
Console.Write("Файловые атрибуты ")
Console.WriteLine(CheckFile.Attributes.ToString)
'Закрываем объект StreamWriter, так и не воспользовавшись его
методами и свойствам (рассмотрим их в следующем задании)
sw.Close()
‘и удаляем файл
CheckFile.Delete()
End If
Console.ReadLine()
End Sub
End Module
Рис. 5. 13. Создаем файл на диске программным образом
Задание 7. Абстрактный класс Stream для работы с блоками
данных
Задача
Использовать объекты классов StreamReader и SteramWriter для
считывания и записи информации в текстовый файл.
Решение
Создайте для файла экземпляр класса System.IO.FileInfo и
воспользуйтесь его методами CreateText и OpenText, возвращающими
объекты классов StreamReader и SteramWriter для считывания и
записи информации в текстовый файл.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Обсуждение
В терминах реализации ввода-вывода в программах Stream(поток) –
это абстрактный класс, предназначенный для работы с блоками
данных.
Абстрактный
класс
System.IO.Stream
определяет
значительное число членов, которые обеспечивают как синхронное,
так и асинхронное взаимодействие со средой хранения данных
(файлом на диске или областью в оперативной памяти).
Все классы, производные от
Stream, предназначены для
работы с блоками данных.
Классы
SteramWriter
и
SteramReader
предназначены
для
считывания
и
записи
символьных данных (данных
в
формате
String).
По
умолчанию оба эти класса работают с кодировкой Unicode.
Проиллюстрируем работу со SteramWriter на примере.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
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).
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Дополните ваше консольное приложение программным кодом.
Позволяющим прочитать на экран те строки, которые вы должны были
записать в файл методом 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 и
воспользуйтесь его свойствами и методами.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Обсуждение
Класс 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")
‘Отображение полных имен файлов с помощью элемента управления
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
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()
Самостоятельно
Создайте собственный браузер для работы с файловой структурой.
Допустим, пользователь должен выполнять операции по копированию.
Удалению, переименованию файлов в двух каталогах. Спроектируйте
интерфейс и напишите программный код, реализующий указанную
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
функциональность. Пример интерфейса – рис. 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.
Обсуждение
Полнотекстный поиск реализовать довольно просто, к сожалению это
относится только к латинским символам или цифрам. Существует
проблема русификации (чтения текса в русской кодировке). Эту
проблему мы здесь не рассмариваем, сейчас научимся сканировать
текстовый файл, пытаясь прочитать каждый его байт и преобразовать
в символ. Обнаружив символ, соответствующий искомому тексту, мы
будем проверять, соответствует ли тексту следующий символ, и так
далее. Это алгоритм поиска, а теперь рассмотрим программный код,
его реализующий.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Функция 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 для
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
взаимодействия с этим файлом
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, получающий список подкаталогов. Для
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
полной обработки дерева каталогов можно рекурсивно вызвать метод
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:\.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 5.17. Результат рекурсивной обработки каталога C:\
Самостоятельно
1. Создайте в главном меню вашей MDI-формы пункт «Рекурсивная
обработка каталогов».
2. Добавьте форму, интерфейс которой будет состоять из элемента
управления ListBox и командной кнопки для отображения
результатов рекурсивной обработки указанного каталога и все
его подкаталогов.
3. При программировании процесса поиска файлов можно
использовать приведенную выше процедуру рекурсивной
обработки каталогов.
Download