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 – имя оператора.

 

 

Контрольные вопросы для самопроверки

  1. Как можно долгосрочно хранить некоторую информацию?
  2. Что такое файл?
  3. Какие имена файлов вы знаете?
  4. Приведите синтаксис оператора «Open». Поясните назначение его параметров.
  5. Как можно организовать совместный доступ нескольких приложений к одному файлу одновременно?
  6. Как определить, что информация в файле исчерпана?
  7. Почему после работы с файлом его рекомендуется закрывать?
  8. В чем вы видите разницу режимов текстового и бинарного файлов?
  9. Как происходит считывание и запись данных в режиме текстового файла?
  10. Как происходит считывание и запись данных в режиме бинарного файла?
  11. В чем разница операторов «Print» и «Write» при работе с файлами?
  12. В чем разница операторов «Input» и «Line Input» при работе с файлами?
  13. Как можно работать с графическими данными?
  14. Каковы основные принципы работы с реестром Windows?