Работа с внешними файлами и устройствами
Файлы последовательного доступа
Последовательным (Sequential) доступом называется способ, при котором данные считыв аются последовательно от начала файла. Чаще всего он применяется для считывания данных из текстового файла формата TXT, в котором содержится последовательность ASCII-кодов символов. Каждая запись в таком файле представляет собой строку символов, заканчивающуюся кодами управляющих символов «13» и «10» (которые называются соответственно «возврат каретки» и «перевод строки»).
Для открытия текстового файла используется оператор
Open имя_файлаFor тип_доступаAs # номер
Здесь имя_файла – имя открываемого файла с указанием пути доступа к нему, тип_доступа – тип доступа (Input – для чтения, Output – для вывода, Append – для добавления), номер – порядковый номер от 1 до 255. В дальнейшем при работе с открытым файлом указывается не имя, а его порядковый номер.
Чтобы закрыть файл используется оператор Close (номер).
Для считывания одной строки из открытого для чтения текстового файла используется оператор Input:
Input # номер,имя_переменной
где имя_переменной – имя переменной типа String.
При открытии файла в его начало автоматически устанавливается так называемый «файловый указатель». После команды Input он перемещается к началу следующей строки. После считывания всех строк он устанавливается в конец файла. При попытке выполнить еще одну команду Inputв этом случае будет выдано сообщение об ошибке (код 62).
Для того, чтобы избежать аварийного завершения программы можно использовать логическую функциюEOF(номер), где номер – номер открытого файла. Например, для считывания данных из текстового файла A.TXT в строковый массив MAS(i) можно использовать цикл типа Do Until … Loop:
i=0
Do Until EOF(1)
i=i+1
Input # 1,MAS(i)
Loop
Полезной может оказаться также функция LOF(номер), возвращающая количество байтов памяти, занимаемых открытым файлом.
Запись данных в файл, открытый для записи, осуществляется командой
Print #номер, список_вывода
Здесь список_вывода – одна или несколько переменных (или строки символов, взятые в кавычки), разделенных либо запятыми (,), либо точками с запятой (;). В первом случае выводимые значения будут записаны в виде одной строки и разделены пробелами, во втором – выведены без разделителя, слитно. Если поставить точку с запятой в конец списка вывода, то следующая порция данных, выводимая оператором будет дописана в ту же строку.
Например, в результате выполнения двух операторов
Print #1, “Иванов”
Print #1, “Петров”
в открытым для вывода под номером 1 файле окажутся две строки по одной фамилии в каждой.
Если в конец первого оператора поставить точку с запятой:
Print #1, “Иванов” ;
Print #1, “Петров”
то будет записана одна строка в виде «ИвановПетров».
Следует отметить, что при попытке открыть для чтения несуществующий файл, будет выдано сообщение об ошибке (код ошибки 53). Если же дана команда открыть несуществующий файл для вывода или добавления, сообщения об ошибке не будет, файл с указанным именем будет создан.
Файлы произвольного доступа
Произвольный (Random) доступ для ввода или вывода применяется в случае, когда записи в файле имеют фиксированную длину.
Открывается файл для произвольного доступа с помощью оператора
Open имя_файлаFor Random [Access доступ] [Lock] As # номер [Len = длина_записи]
В квадратных скобках указаны необязательные параметры.
ПараметрAccess позволяет задать тип доступа к открываемому файлу. Если он не указан, то по умолчанию используется значение ReadWrite (возможно как чтение, так и запись).
Параметр Lock позволяет задать права доступа к открытому файлу и указывается, если один и тот же файл может использоваться несколькими пользователями или приложениями. Он может принимать следующие значения:
1) Shared (общий) – файл может использоваться всеми процессами для считывания и для записи;
2) LockRead (закрыт для чтения) – никакой другой процесс не может считывать данные из файла;
3) LockWrite (закрыт для записи) – никакой другой процесс не может записывать данные в файл;
4)LockReadWrite (закрыт для чтения и записи) – никакой другой процесс не может ни считывать, ни записывать данные в файл;
Параметр Len задает длину одной записи в байтах
Для чтения данных используется операторGet:
Get # номер , номер_записи, переменная
Для записи – оператор Put:
Put # номер , номер_записи, переменная
В качестве примера рассмотрим следующую задачу. Необходимо создать файл с именем Spisok.dat, в котором каждая запись состоит из двух полей. Первое поле для записи фамилии (типа String длиной 20 символов), вторая для записи личного номера (типа Ineger).
Для того, чтобы в одной записи сохранить значения данных различных типов используем в программе пользовательский тип данных, которому присвоим наименование Person. Кроме того, опишем массив Mass из 100 элементов типа Person.
Type Person
FamAs String* 20
Nom As Integer
End Type
DimMass(1 to 100) AsPerson
В процедуре, которая открывает файл для записи сформированного массива с фамилиями и номерами будут следующие операторы
Private Sub Command1_Click()
Open “Spisok.dat”For Random As #1 Len = 22
For i =1 to 100
Put #1, i , Mass(i)
Nexti
Close #1
End Sub
Предположим, что в дугой процедуре нужно открыть файл Spisok.dat, прочитать записи и вывести значения полей каждой записи на печать.
Private Sub Command2_Click()
DimzapAsPerson
DimnomerAs Integer
Open “Spisok.dat”For Random As #1 Len = 22
nomer = 1
Do until EOF(1)
Get #1, nomer , zap
Printzap.Fam, zap.Nom
nomer = nomer +1
Loop
Close #1
End Sub
Примечание. В приведенных выше примерах операторе Open параметру Len присвоено значение 22. Это длина в байтах считываемой записи (20 байт занимает поле Fam и 2 байта поле Nom). Можно было бы поступить по-другому, воспользовавшись функциейLen(переменная), указав в качестве аргумента имя zap – переменной введенного нами типа Person.:
Open “Spisok.dat”For Random As #1 Len = Len(zap)
Файлы прямого доступа можно использовать и для записи стандартных типов данных. Длина каждой записи при этом определяется типом данных (см. табл. 3).
Работа с дисками и папками
На панели инструментов окна Visual Basic есть три объекта, с помощью которых можно осуществлять просмотр существующих на диске папок и выбрать нужные файлы для последующей работы с ними.
Это объекты DriveListBox (список дисков), DirListBox (список папок) и FileListBox (список файлов). При размещении экземпляров этих объектов на форму им будут присвоены имена соответственно Drive1, Dir1 иFile1.
Основным свойством объекта Drive1 является свойство Drive– имя выбранного диска из числа доступных в данный момент. Присвоение значения этому свойству происходит после выбора нужного имени из списка дисков (событие Change).
У объекта Dir1основным свойством является Path – после выбора из списка папок (событие Change) там сохраняется имя выбранной папки или список вложенных папок, разделенных слэшом (обратной косой чертой).
Объект File1на форме представлен в виде текстового окна со списком файлов текущей папки. При выборе из этого списка нужного имени с помощью мыши (событие Click) свойству FileName присваивается имя выбранного файла с указанием пути к текущей папки. Для того, чтобы связать список файлов с выбранной папкой, используется свойство Path.
В качестве примера на рис.23 приведен текст трех процедур, которые запускаются при наступлении указанных событий. В результате работы программы выбранный текстовой файл открывается, считывается и текст выводится в текстовое окно.
Private Sub Drive1_Change() ' после выбора нужного диска из списка
Dir1.Path = Drive1.Drive ' его имя передается свойству Dir1.Path
ChDir Dir1.Path ‘ и выполняется команда “сменить директорию”
End Sub
Private Sub Dir1_Change() ' после выбора нужной папки из списка
File1.Path = Dir1.Path ' путь к этой папке передается свойству File1.Path
End Sub
Private Sub File1_Click() ' после выбора нужного файла
File_name = Dir1.Path + "\" + File1.FileName ‘ переменной File_name присваивается
' имя файла и добавляется путь к нему
Open File_name For Input As #1 ’ файл открывается для чтения
ST = "" ' в переменную ST построчно
Do Until EOF(1) ' считываются записи из файла
Input #1, S ' и добавляются управляющие коды
ST = ST + S + Chr(13) + Chr(10) ' <13>, <10>
Loop ‘ файл закрывается
Close #1 ' значение переменной ST выводится
Text2.Text = STT ‘ в окно Text2
End Sub
Рис.23. Пример использования объектов DriveListBox, DirListBox и FileListBox
Примечание. Для объекта Text2 необходимо на этапе создания экранной формы задать свойство Text2.Multiline = True. Это необходимо для того, чтобы в текстовое окно можно было вывести несколько строк.
Еще одну возможность выбора папки и файла из списка имеющихся на диске дает использование объектаCommonDialog. Этот объект отсутствует изначально на панели инструментов. Для того, чтобы его туда поместить, необходимо в основном меню выбрать пункт Project в развернувшемся меню выбрать опцию Components…, в появившемся окне (рис.24) отметить пункт Microsoft Common Dialog Control.
Рис. 24. Окно выбора компонентов
В результате в панель инструментов будет добавлена пиктограмма объекта CommonDialog. У этого объекта есть ряд методов, используя которые можно открывать диалоговые окна для выбора файла (методShowOpen); для сохранении файла на диске (метод ShowSave); для выбора цвета из палитры (метод ShowColor); для выбора имени шрифта, его размер и стиля (метод ShowFont).
Если поместить объект CommonDialog на форму, ему будет присвоено имяCommonDialog1. Для того чтобы в чтобы организовать режим выбора нужного файла из диалогового окна Open в соответствующей процедуре достаточно написать строку
CommonDialog1.ShowOpen
Выполнение этой команды приведет к появлению на экране так называемого «файлера» – диалогового окна, с помощью которого можно выбрать нужный диск, папку и файл (см. рис.25). После выбора нужной папки и файла и нажатия кнопки «Открыть» имя выбранного файла передается свойству FileName объектаCommonDialog. После этого он может быть открыт, например для чтения, командой
|