Тверской государственный университет
Опубликован: 13.09.2006 | Доступ: свободный | Студентов: 3491 / 369 | Оценка: 4.65 / 4.29 | Длительность: 30:37:00
Специальности: Программист, Менеджер
Лекция 15:

Файловый ввод-вывод.

Открытие и создание файлов

Файлы перечисленных видов открываются и могут создаваться оператором Open, который вызывается так:

Open имя-файла For режим [Access доступ] [блокировка] As [#]номерФайла [Len=длина-записи]
  • Параметр имя-файла - строковое выражение, задающее имя открываемого (создаваемого) файла, в него может входить также путь ѕ имя диска и имена каталогов (папок) на пути к файлу.
  • Параметр режим - ключевое слово, которое для файлов последовательного доступа может принимать одно из значений: Input (ввод), Output (вывод), Append (присоединение). Для файлов с произвольным доступом в качестве режима нужно указать Random, а для бинарных файлов - Binary.
  • Параметр доступ необязателен, он ограничивает набор операций, которые разрешено выполнять над открываемым файлом; возможные значения: Read (только чтение), Write (только запись), Read Write (и то и другое).
  • Параметр блокировка позволяет ограничить набор операций над открываемым файлом, выполняемых другими процессами; возможные значения: Shared (разделяемый, другим процессам разрешается работать с файлом без всяких ограничений), Lock Read (запретить чтение), Lock Write (запретить запись), Lock Read Write (запретить чтение и запись). Здесь требуется некоторые пояснения. С одним и тем же физическим файлом одновременно могут работать разные приложения. Возможна и ситуация, когда одно приложение одновременно работает с несколькими экземплярами файла, присваивая каждому экземпляру свой уникальный номер. Параметр блокировка позволяет регулировать отношения между клиентами, получающими доступ к файлу.
  • Параметр номерФайла - целое число в интервале от 1 до 511, идентифицирующее файл для других операций. Для каждой операции открытия файла номер-файла должен отличаться от номеров всех открытых в текущий момент файлов. Узнать очередной свободный номер позволяет функция FreeFile.
  • Параметр длина-записи - число не более 32767 - обязателен для файлов произвольного доступа и задает для них длину одной записи файла в байтах. Для последовательных файлов он необязателен (для них он задает размер буфера, создаваемого при открытии), для бинарных файлов он игнорируется.

Если последовательный файл, открываемый в режиме вывода ( Output ), существует, его содержимое будет утеряно, и данные будут записываться в его начало. Если его нет, создается новый файл. Точно так же будет создан новый файл, если файл, определяемый параметром имя-файла, не существует, а режим открытия задан как Append, Random или Binary. При попытке открыть несуществующий файл в режиме Input будет получено сообщение об ошибке.

Последовательные файлы в режиме чтения, файлы произвольного доступа и бинарные можно открывать по несколько раз с различными номерами. С каждым из номеров будет связан свой буфер, что может повысить эффективность работы с файлом. Файл, открытый для чтения, должен быть закрыт перед его открытием в режимах записи Output или Append.

Рассмотрим детали открытия и создания файлов. В первом примере открывается файл последовательного доступа "read.me" для чтения:

Open "read.me" For Input As #1

Имя можно передавать и через переменную или более сложное строковое выражение:

Const Path = "e:\O2000\CD2000\Ch14\"

Public Sub Openfile()
	Dim NewFile As String, NewNum As Integer
	NewFile = "read.me"
	NewNum = FreeFile	' очередной незанятый номер файла
	Open Path & NewFile For Output As NewNum

End Sub

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

Файл с последовательным доступом особенно удобен, когда при работе с ним требуется последовательно прочесть и обработать все записи файла. Если же данные из файла обрабатываются в произвольном порядке, или файл открывается для того, чтобы получить доступ к небольшому числу его записей, крайне желательно иметь возможность произвольного (прямого) доступа к нужному элементу файла. Такую возможность и обеспечивают файлы VBA с произвольным доступом, хотя у них есть серьезное ограничение, все записи должны иметь одинаковый размер. Это крайне неудобно в наиболее типичном случае, когда элементами файла с произвольным доступом являются записи, длины которых, естественно, могут быть не постоянны из-за, например, наличия в них строк переменной длины. В таких ситуациях одним из выходов является переход к строкам постоянной длины. Радикальное решение, как мы уже говорили, состоит в том, чтобы в подобных ситуациях переходить на работу с базами данных. Рассмотрим пример открытия двух файлов - файла с произвольным доступом для хранения записей пользовательского типа и бинарного файла для хранения картинки. Вначале дадим объявление пользовательского типа:

Type Person ' пользовательский тип записи.
	Возраст As Integer
	Фамилия As String * 20
	Имя As String * 20
End Type

Обратили внимание на то, что фамилия и имя заданы, как строки постоянной длины. В данном случае это принципиально, поскольку предполагается возможность хранения переменных этого типа в файле с произвольным доступом. Вот процедура открытия двух файлов:

Public Sub OpenTwoFiles()
	Dim attr As Integer, Num As Integer
	Dim MyFriend As Person		' объявление переменной
	' Открываем файл с произвольным доступом для записи:
	Num = FreeFile
	Open "Friends" For Random Access Read Write As Num Len = Len(MyFriend)
	PrintAttr (Num)
	Debug.Print "Длина Записи:", Len(MyFriend)
	' Открываем двоичный файл
	Num = FreeFile
	Open "pict.bmp" For Binary Access Read Lock Read As Num
	PrintAttr (Num)

End Sub

Public Sub PrintAttr(ByVal Num As Integer)
	'Эта процедура по номеру файла определяет его атрибуты
	'и выводит соответствующее сообщение в окно отладки
	Dim Msg As String, attr As Integer
	
	attr = FileAttr(Num, 1)
	Debug.Print "файл # ", Num
	Select Case attr
		Case 1: Msg = "Input"
		Case 2: Msg = "Output"
		Case 4: Msg = "Random"
		Case 8: Msg = "Append"
		Case 32: Msg = "Binary"
		Case Else: Msg = "Таких файлов не бывает"
	End Select
	Debug.Print "Открыт для ", Msg
	
End Sub
14.1.

В этом примере для определения свободного номера файла использовалась функция FreeFile, а для определения длины записи ѕ функция Len. Файл произвольного доступа открыт как для чтения, так и для записи, а бинарный файл только для чтения. Заметьте, что бинарный файл закрыт для чтения другими процессами. Поэтому если повторно запустить процедуру открытия, то файл произвольного доступа будет повторно открыт с другим номером, но возникнет ошибка при повторном открытии бинарного файла. Возможность одновременного открытия под разными номерами нескольких логических экземпляров одного и того же физического файла бывает крайне полезной в ряде ситуаций.

Функция

FileAttr(номер-файла, 1)

по номеру открытого файла возвращает число, указывающее режим открытия: 1 - Input, 2 - Output, 4 - Random, 8 - Append, 32 - Binary. Второй аргумент достался функции FileAttr в наследство от 16-разрядного режима, где при его значении 2, она возвращала системный указатель на файл.

Мы написали простую процедуру PrintAttr, которая по номеру файла определяет его атрибуты и выводит сообщение в окно отладки. Приведем результаты работы процедуры OpenTwoFiles:

файл #		 1 
Открыт для	Random
Длина Записи:    42 
файл #		 2 
Открыт для	Binary
полина есенкова
полина есенкова
Дмитрий Вологжин
Дмитрий Вологжин
Добрый день, прошел тесты с 1 по 9, 10 не сдал, стал читать лекцию и всё пройденные тесты с 1 по 9 сбросились, когда захотел пересдать 10 тест.