8.
СОХРАНЕНИЕ И
СЧИТЫВАНИЕ
ИНФОРМАЦИИ
Чтобы после завершения работы программы все данные, созданные в памяти, не пропали, нужно уметь сохранять информацию на жестком диске. В противном случае вся информация бесследно исчезнет. Сохранять данные и считывать их можно различными способами. Для работы с информацией различного объема и формата можно использовать двоичные и текстовые файлы. Для хранения малых объемов информации можно использовать реестр Windows. А для самых сложных задач разумно воспользоваться базами данных.
8.1.
Открытие
файлов с
помощью
оператора «Open»
Файл – именованная область любого внешнего накопителя информации. Данные «живут» в памяти компьютера, а файлы – на жестком диске. Программа не работает с файлами напрямую, а использует в качестве посредника операционную систему.
Имена файлов бывают двух видов: полные – помимо имени файла указывается также местоположение файла на внешнем носителе (например «C:\Program Files\Microsoft Visual Studio\VB98\VB6.EXE») и краткие – только имя файла (VB6.EXE). Если местоположение файла не указано, то он будет искаться в текущей папке, по умолчанию – папка, где находится ваше приложение. Непосредственное имя файла состоит из двух частей: собственно уникальное имя файла и его расширение. Собственно имя идентифицирует файл, а расширение обычно указывает на формат файла или на то, какой программой он создан.
Перед началом работы с файлом необходимо запросить у операционной системы указатель (дескриптор) файла. Для его получения пользуются функцией «FreeFile». Затем с помощью оператора «Open» этот указатель связывается с необходимым файлом. Только после этого программа сможет работать с ним. Синтаксис открытия файла следующий:
‘получаем свободный указатель файла и присваиваем его переменной
FileHandle% = FreeFile
‘открываем файл
Open FilePath [For Mode]
[Access AccessType] [LockType]_
As [#]FileHandle% [Len = CharInBuffer%]
...(работа с файлом)
Close [#]FileHandle
· FileHandle% – переменная, в которой хранится указатель файла;
· FreeFile – имя функции, возвращающей указатель файла;
·
Open
– имя
оператора;
· FilePath – полное имя файла;
· For – ключевое слово, за которым идет описание режима доступа к файлу;
· Mode – режим доступа к файлу (см. табл. 15);
Таблица 15
Режимы доступа к файлу
Режимы доступа |
Описание |
Append |
Добавление данных в конец существующего текстового файла. Если файл не существует, он будет создан |
Binary |
Открытие файла в двоичном режиме, т.е. в виде набора байтов. Если файл не существует, но будет создан |
Input |
Открытие файла для чтения в текстовом формате |
Output |
Открытие файла для записи текстового файла. При этом вся старая информация будет удалена. Если файл не существует, но будет создан |
Random |
Открытие файла в режиме произвольного доступа. Такой режим используется для работы с простыми записями. Если файл не существует, но будет создан |
· Access – необязательное ключевое слово, за которым следует описание типа доступа;
· AccessType – описание типа доступа:
· Read – чтение;
· Write – запись;
· Read Write – чтение и запись.
Примечание |
При режимах доступа Append и Output доступен только тип доступа Write, при Input – только Read, а при Binary и Random доступны все три типа доступа. |
· LockType – необязательный параметр, определяющий, смогут ли другие программы использовать этот файл, пока с ним работает ваша программа. Обычно оно связано с работой в сети (см. табл. 16).
Таблица 16
Возможные значения параметра LockType
Значение |
Описание |
Shared |
К файлу будут иметь полный доступ все пользователи с необходимыми правами |
Lock Read |
Блокируется чтение файла, а запись разрешена |
Lock Write |
Блокируется запись в файл, а чтение разрешено |
Lock Read Write |
Запрещается и чтение, и запись в него |
· As – ключевое слово, за которым следует указатель файла.
· # – символ, указывающий, что следующее за ним значение является указателем файла.
· Len – необязательное ключевое слово, за которым должен следовать параметр, определяющий длину записи.
· CharInBuffer% - длина записи для файла, открытого в режиме произвольного доступа (Random).
· Close – оператор, закрывающий файл, связанный с указанным дескриптором.
Примечание |
Оператор «Open» только открывает файл для последующей работы. Считывание и запись в файл осуществляется с помощью других методов. |
Важно закрывать файл после окончания работы с ним. Оператор «Close» освобождает указатель файла и связанную с ним область памяти.
При работе с файлом, а именно при чтении из него, очень важно определение конца файла. Его можно определить с помощью функции EOF (End Of File):
EOF(FileHandle)
· EOF – имя функции;
· FileHandle – указатель файла, конец которого определяется.
Функция возвращает True (истина), если конец файла достигнут, в противном случае возвращается False (Ложь).
8.2.
Чтение и
запись в
текстовой
файл
Текстовой файл открывают в режиме доступа «Input», «Output» или «Append» (см табл. 15). Особенность этого режима в том, что в нем работают только с конкретными печатаемыми символами. Со служебными символами работать бесполезно.
Для записи информации используют два оператора «Print» и «Write», синтаксис которых следующий:
Print #FileHandle%,
VarBuffer [;]
Write #FileHandle%,
VarBuffer [;]
· Print/Write – ключевые слова операторов.
· #FileHandle% - указатель файла, в который будет помещена информация.
· VarBuffer – значение, которое будет записано в файл.
· ; – необязательный параметр, использующийся при записи в текстовой файл, означает, что следующее значение будет записано в эту же строчку, а при его отсутствии – в следующую.
Примечание |
Разница операторов «Print» и «Write» заключается в том, что при записи в текстовой файл данных в одну строчку информация будет разделена в случае оператора «Print» пробелами, а при использовании «Write» - запятыми. В остальных случаях принципиальной разницы в них нет. |
Для чтения
информации
из файла
применяют
операторы «Input» и «Line Input».
Синтаксис их аналогичен друг другу:
Line Input #FileHandle%,
VarBuffer
Input #FileHandle%,
VarBuffer
· Line Input / Input – ключевые слова операторов.
· #FileHandle% - указатель файла, из которого будет считана информация.
· VarBuffer – переменная, в которую будет считываться информация.
Разница операторов «Line Input» и «Input» состоит в том, что первый предназначен только для текстовых файлов, а второй – для любых. В случае текстовых файлов «Input» считывает данные, находящиеся в одной строчке, до первого разделителя (для текстовых данных разделителем является «,» (запятая), а для числовых – « » (пробел) и «,»), а «Line Input» считывает сразу всю строку, игнорируя любые разделители.
Примечание |
В Visual Basic нет средств контроля формата ранее созданных файлов. Поэтому символ «2» может быть считан как соответствующее число и наоборот. |
8.3.
Работа с
бинарными
файлами
Файлы открываются в бинарном формате оператором «Open» в режиме «Binary». Отличительной чертой этого режима является то, что работа с файлом ориентирована исключительно на конкретные байты. Поскольку Visual Basic может адресоваться напрямую к нужному месту файла, этот режим также называется – режимом прямого доступа. Другая особенность этого режима – наличие возможности одновременной записи и считывания информации в разные части файла не переоткрывая его. Запись в файл, открытый в бинарном режиме, осуществляется следующим синтаксисом:
Put #FileHandle%,
[RecNumber], NameVar
· Put – имя оператора записи информации.
· FileHandle% - файловый указатель.
· RecNumber – номер байта файла, в который будет записана информация (необязательный параметр).
· NameVar – переменная, содержимое которой будет записано в файл.
Считывание информации из файла в бинарном режиме происходит с помощью следующего оператора:
Get #FileHandle%,
[RecNumber], NameVar
· Get – имя оператора записи информации.
· FileHandle% - файловый указатель.
· RecNumber – номер байта файла, из которого будет считана информация (не обязательный параметр).
· NameVar – имя переменной, в которую будет помещена считанная информация.
Поскольку бинарный режим ориентирован на байты информации, то при чтении из файла буферная переменная должна иметь строго определенный тип: либо «Byte», тогда будет считано числовое значение байта, либо символьный фиксированной длины в один символ, тогда байт будет считан в виде символа, ANSI, код которого соответствует величине байта. Этот символ может быть даже управляющий, чего нельзя добиться в случае с текстовыми файлами.
Примечание |
При попытке считать информацию из байта, которого нет (за границами файла), то вместо ошибки будет считан нуль в числовом формате, или пустой символ – в случае текстового. |
При отсутствии параметра «RecNumber» запись или считывание информации будет происходить в следующем байте файла после того, с которым до этого работали.
Примечание |
Если пользуетесь функцией «EOF» для определения конца файла, помните, что последним будет считан спецсимвол, означающий конец файла, который необходимо удалить. |
8.4.
Манипуляции
графикой
Сохранять в файлах и извлекать из них можно и графические изображения. Чтобы извлечь из растрового файла или файла пиктограммы и присвоить его свойству «Picture» элементов управления «PictureBox» и «Image», используется функция «LoadPicture( )» со следующим синтаксисом:
ImageCtrl.Picture =
LoadPicture(FilePath)
· ImageCtrl – имя элемента управления окном с рисунком, элемента управления изображением или формы;
· Picture – имя свойства объекта, отвечающее за изображение;
·
LoadPicture
– имя
функции;
· FilePath – полное имя файла.
Сохранить рисунок из свойства «Picture» можно с помощью оператора «SavePicture» со следующим синтаксисом:
SavePicture ImageCtrl.Picture, FilePath
· SavePicture – имя оператора;
· ImageCtrl – имя элемента управления окном с рисунком, элемента управления изображением или формы;
· Picture – имя свойства объекта, отвечающее за изображение;
· FilePath – полное имя файла с указанием его расположения на диске.
8.5.
Работа с
данными в
реестре
Для хранения небольших фрагментов информации символьного формата можно использовать реестр Windows. В Visual Basic имеются четыре процедуры, которые можно использовать для доступа к нему. Они очень просты в применении, но имеют один главный недостаток: можно получить доступ к данным только из определенного раздела реестра: «MyComputer\HKEY_CURRENT_USER\Software\VB and VBA Program Settings». Чтобы получить доступ к другим разделам реестра, нужно воспользоваться специальными функциями «Win32 API».
Чтобы получить значение параметра из посвященного Visual Basic раздела реестра Windows, нужно использовать следующую функцию:
MyString =
GetSetting(VBKeyName, Section, Key [,Default])
· MyString – строка для хранения возвращаемого функцией значения;
·
GetSetting
– имя
функции.
· VBKeyName – строковое значение, которое является именем внутреннего подраздела VB/VBA.
· Section – строковое значение, представляющее раздел или подраздел конкретного приложения.
· Key – строковое значение, которое представляет имя параметра в разделе.
· Default – необязательный аргумент, значение которого будет возвращено, в случае ошибки (отсутствие параметра).
Для сохранения некоторого значения в реестре Windows используется следующий оператор:
SaveSetting VBKeyName,
Section, Key, MyString
·
SaveSetting
– имя
оператора.
· MyString – строковая переменная, в которую будет помещено найденное значение.
Для получения из реестра массива, содержащего все значения параметров из определенного подраздела, используется следующая функция:
MyVariant =
SetAllSettings(VBKeyName, Section)
· MyVariant – возвращаемый функцией массив значений типа «Variant».
·
SetAllSettings
– имя
функции.
· Section – строковое значение, представляющее раздел или подраздел конкретного приложения.
Для удаления целого раздела параметров применяется оператор со следующим синтаксисом:
DeleteSetting VBKeyName,
Section, Key
·
DeleteSetting
– имя
оператора.
Контрольные
вопросы для
самопроверки