Структура DBF-файла
Первые 32 байта (00..31) заголовка DBF-файла описывают глобальные параметры, относящиеся ко всей таблице. Непосредственно за этим описанием следуют определения полей. Ниже в двух таблицах подробно рассмотрена структура заголовка DBF-файла.
По адресу 0x0032 (см. предыдущую таблицу 32..nn) начинаются определения полей (колонок) таблицы. Каждое определение занимает 32 байта. В следующей таблице описывается структура определения одного поля. Все определения следуют одно за другим без каких-либо разделителей.
По адресу 0x0008 (см. первую таблицу 08..09) хранится адрес начала области самих записей с данными таблицы dBASE. Каждая запись начинается с байта признака удаления. Если первый байт записи содержит значение 0x20 (символ пробела), то запись считается рабочей (не удалённой) и при запросах выдаётся пользователю. Когда пользователь удаляет запись (или набор записей), то для экономии времени и повышения быстродействия запись физически не удаляется, она просто помечается как удалённая. В первый байт записи (признак удаления) записывается значение 0x2A (символ «звёздочка»). Чтобы избавиться от записей, помеченных на удаление, нужно сделать паковку таблицы. Для этого, например, в среде FoxPro или Visual FoxPro существует команда PACK. Эта команда удаляет записи, помеченные «звёздочкой», физически. После этой процедуры файл становится меньше, отсюда и название: паковка. В конце файла за последней записью данных записывается ещё один байт — байт завершения файла, его значение всегда 0x1A. Всегда, да не всегда... На следующих двух рисунках отображены два файла с одними и теми же данными открытые в HexEdit (шестнадцатеричный редактор). Посмотрите внимательно и сравните. Два основных отличия:
Ну действительно, зачем в FoxPro 2.x 263-х байтный блок, если FoxPro не поддерживает базу данных. В FoxPro 2.x этот блок всегда будет пустым. Хотя его можно организовать и всё прекрасно будет работать. Главное чтобы позиция первой записи данных была правильно определена — байты 08..09 в заголовке. Обратите внимание смещение позиции первой записи записано как бы «задом наперёд». Например, если первая запись начинается со смещения 0x01A8, то в заголовке в ячейках 08..09 сначала записан старший байт значения 0xA8, а потом младший — 0x01 (на рис 2. в этом можно убедиться). Почему? Это уже другая тема. Так исторически сложилось. (Если интересно, обратитесь к какому-нибудь пособию по ASSEMBLER, например, есть очень хорошая книга Питера Абеля «Язык Ассемблера для IBM PC и программирования». Прочитав первые две главы, я уверен, всё встанет на свои места!) А вот почему у Visual FoxPro отсутствует завершающий байт 0x1A, честно говоря, мне не понятно. Узнал об этом чисто случайно. Причём, если его установить принудительно, Visual FoxPro сочтёт это ошибкой и не откроет такой файл. Так что в Visual FoxPro последний байт в файле — суть последний байт последней записи данных. Вот собственно и всё! Ниже показано как Visual FoxPro 9 отображает эти два примера в режиме BROWSE. Чёрный маркер (прямоугольник) слева на второй записи означает, что запись помечена на удаление. Посмотрите на рис. 2 по адресу 0x01DB установлена «звёздочка» (значение 0x2A). На рис. 1 та же запись начинается по адресу 0x00D4. | |||||||||||||||||||||||||||||||||||||||||||||||
Добавлять комментарии могут только зарегистрированные пользователи с подтверждённым E-Mail адресом.