Версия для печати
Структура DBF-файлов для непродвинутых
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=624Александр Терехов
дата публикации 17-07-2002 15:30Структура DBF-файлов для непродвинутых Вступление
Все было бы хорошо, если бы не BDE...
Нет, BDE - это очень даже хорошо, плохо то, что использовав в программе однажды TTable, приходится ломать голову над тем, как же с минимальными потерями "прикрутить" BorlandDatabaseEngine к пользовательской машине. Это первое, что заставляет сесть за изучение заголовков DBF-файлов. И второе. Эти самые DBF-файлы имеют такую особенность, как разрушение заголовков. И третье, и четвертое, и пятое...Для Вас не составляет сложности написать компонент, который работает с DBF-таблицами?.
В этом случае НЕМЕДЛЕННО прекратите чтение статьи!
А мы же посмотрим, что из себя представляют заголовки DBF-файлов и как можно использовать свои знания о них в практическом применении.DBF-файл состоит из двух частей:
Структура DBF-файла Схематично все это можно представить так:
- заголовок
- собственно записи
Таблица 1. Структура DBF-файла Кол-во байт Наименование 32 Заголовок DBF-файла 32 Описание первого поля 32 Описание второго поля ... ... 32 Описание n-го поля 1 Завершающий символ 0x0D (13) RecordSize Первая запись из n-полей RecordSize Вторая запись из n-полей ... ... RecordSize m-я запись из n-полей, где m=RecordsCount 1 Завершающий символ 0x1A (26) RecordSize (размер записи в байтах) и RecordsCount (количество записей), значения которых берутся из заголовка DBF-файла, будут рассмотрены ниже.
Теперь, когда мы знаем из каких частей состоит DBF-файл и какой размер они имеют, перейдем к более подробному рассмотрению их структуры.Как видно из предыдущей таблицы, заголовок состоит из трех частей:
Описание заголовка DBF-файла Размер "собственно заголовка" составляет 32 байта, каждый из которых несет строго определенное значение.
- собственно заголовок
- описание полей
- завершающий заголовок символ 0x0D(13)
Сокращения:
Таким образом мы сумели описать первых 32 байта DBF-файла. Начиная с 33 байта начинаются описания полей, каждое из которых также имеет размер в 32 байта.- FS = FlagShip
- Fb = FoxBase
- Fp = FoxPro
- CL = Clipper
- D3 = dBaseIII+
- D4 = dBaseIV
- D5 = dBaseV
Структура описания полей в заголовке DBF-файла
Таблица 3. Структура описания полей в заголовке DBF-файла № байта Размер Значение Описание Используется 00 11 ASCII Имя поля с 0x00 завершением Все 11 1 ASCII Тип поля см. Таблицу 4 Все 12 4 n,n,n,n Адрес поля в памяти D3 0,0,n,n Смещение относительно начала записи Fp 0,0,0,0 Игнорируется FS, D4, D5, Fb, CL 16 1 Byte Размер поля см. Таблицу 4 Все 17 1 Byte Количество знаков после запятой Все 18 2 0,0 Зарезервировано Все 20 1 Byte Идентификатор рабочей области D4,D5 0x00 Не используется FS, D3, Fb, Fp, CL 21 2 n,n Многопользовательский dBase D3, D4, D5 0,0 Игнорируется FS Fb, Fp, CL 23 1 0x01 Установленные поля D3, D4, D5 0x00 Игнорируется FS Fb, Fp, CL 24 7 0..0 Зарезервировано Все 31 1 0x01 Поле включено в .mdx индекс D4, D5 0x00 Игнорируется D3, FS, Fb, Fp, CL
Таблица 4. Типы полей и их размеры Код Тип Размер Описание/Размер Используется C 1..n Char n ASCII символов Все пустые места - пробел 0x20(32) n = 1..64Kbt FS n = 1..32Kbt Fp, CL n = 1..254 Все D 8 Date 8 ASCII знаков (0..9) в формате YYYYMMDD Все F 1..n Float ASCII символы(-.0123456789)
переменная позиция плавающей точки
n = 1..20FS, D4, D5, Fp N 1..n Numeric ASCII символы (-.0123456789)
фиксированная позиция точкиВсе n = 1..20 FS, Fp, CL n = 1..18 D3, D4, D5, Fb L 1 Logical ASCII символы (Yy Tt Nn Ff, пробел - не определено) FS, D3, Fb, Fp, CL ASCII символы (Yy Tt Nn Ff, ? - не определено) D4, D5 (FS) M 10 Memo 10 цифр, определяющих начало блока данных в .dbt-файле
или 10 пробелов, если поле мемо пустоВсе V 10 Variable Переменная Bin/ASCII данных в .dbv-файле
4 Bin байтов - начало блока в мемо-файле
4 Bin байтов - размер блока
1 Bin байт - подтип данных
1 Bin байт - зарезервировано 0x1A(26)FS P 10 Picture Binary данные в .ftp-файле
структура такая же как и в Memo-типеFp B 10 Binary Binary данные в .dpt-файле
структура такая же как и в Memo-типеD5 G 10 General OLE-объекты
структура такая же как и в Memo-типеD5, Fp 2 2 short int Binary int max +/- 32767 FS 4 4 long int Binary int max +/- 2147483647 FS 8 8 double Binary signed double IEEE FS
Завершает описание заголовка символ 0x0D(13) Теперь уже можно сделать кое-какие вычисления. Например, определить количество полей в DBF-файле.
Размер заголовка DBF-файла в байтах составляет:
32+32xN+1 байт, где N - количество полей.
Этот же размер можно извлечь из 8,9 байтов заголовка - HeaderSize
Следовательно количество полей равно:
N:=(HeaderSize-33)/32 байт.
Сместившись на HeaderSize байт от начала файла, мы переходим к непосредственно к самим записям, размер которых указан в 10,11 байтах заголовка - RecordSize, а их количество в 04..07 байтах - RecordsCount.
Структура записи в DBF-файле более простая.Каждая запись имеет следующую структуру.
Структура записи в DBF-файле
Таблица 5. Структура записи в DBF-файле № байта Размер Описание Используется 0 1 Флаг удаления "*", иначе - пробел Все 1 1..n Различные типы полей фиксированной длины
без завершающих символов
длина поля n определяется в 16 байте структуры описания поля.Все
Завершает DBF-файл символ 0x1A(26) Таким образом, в общем случае запись - это строка символов (кроме FS), состоящая из частей (полей) строго определенного размера. Эти размеры указаны в структуре описания поля в 16-м байте.
Теперь, изучив строение структуры DBF-файла мы можем:
ВЫВОДЫ
- Получить важные сведения о DBF-файле из его первых 32 байтов
- Изменить несколько важных значений DBF-файла:
- изменить языковой драйвер таблицы
- отвязать таблицу от индексного файла
- по желанию - еще что-нибудь
- Определить количество и тип полей в DBF-файле
- Отследить разрушение заголовка DBF-файла путем расчета места нахождения завершающего заголовок символа и сравнения его с 0x0D(13)
- Попытаться восстановить заголовок
- Создать примитивный драйвер работы с DBF-файлом без BDE
- И многое, многое другое...
Небольшой пример
Пример примитивного драйвера работы с DBF-файлом без BDE и возможности изменения заголовка DBF-файла находится в файле DBHeader.zip (7K)
Пример подробно откомментирован, поэтому в тексте статьи приводить его не буду. Тем более что, как говорится, "лучше один раз увидеть"...
В качестве полигона можно использовать DBF-таблицы, поставляемые вместе с Delphi: \DelphiX\Demos\Data\*.dbfВ дополнение к материалу: DBFCodePage.zip (1.7K) небольшой перекодировщик (языковой драйвер) ascii ANSI Win 1251 в dBase RUS cp866 и обратно.