Файлы .fpt и .dbt: где на самом деле лежит длинный текст
Если рядом с таблицей лежит файл с тем же именем и расширением .fpt или .dbt — это не мусор и не резервная копия. Это вторая половина таблицы, без которой часть данных не существует.
Зачем понадобился отдельный файл
В DBF все записи одинаковой длины: это и делает формат быстрым — адрес любой записи считается умножением. Но длинный текст в такую схему не помещается: нельзя объявить поле «комментарий» длиной в 5000 байт, если у 99% записей комментария нет.
Решение простое: в самой таблице хранится не текст, а номер блока в отдельном файле. Поле занимает 4 или 10 байт, а текст любой длины лежит рядом.
Три формата memo
| Файл | Кто пишет | Как устроен |
|---|---|---|
.DBT (dBase III) | dBase III+, ранние Clipper | блоки по 512 байт, текст заканчивается парой 0x1A 0x1A |
.DBT (dBase IV) | dBase IV и 5 | блок начинается сигнатурой FF FF 08 00, затем длина |
.FPT | FoxPro 2.x, Visual FoxPro | размер блока в заголовке, у каждого блока тип и длина |
.SMT | Clipper SIX | восьмибайтовый заголовок блока |
Отличается и ссылка в самой таблице: Visual FoxPro пишет номер блока четырьмя байтами в двоичном виде, а FoxPro 2.x и dBase — десятью символами-цифрами. Перепутать их нельзя: одно и то же поле будет читаться либо как текст, либо как мусор.
Почему вместо текста пусто
Три типичные причины, в порядке частоты:
- Файл memo не приложен. Скопировали только .dbf — текст остался на прежнем месте. Лечится переносом обоих файлов; в TablesViewer достаточно перетащить их вместе или открыть папку целиком.
- Программа не умеет читать этот вариант memo. Универсальные просмотрщики часто поддерживают только .DBT dBase III и показывают номер блока вместо текста.
- Файл memo обрезан или испорчен. Такое бывает после копирования во время работы программы. Часть записей читается, часть — нет.
Как понять, что memo вообще есть
Признаков два. Первый — тип поля в структуре таблицы: M (memo), G (general), P (picture), W (blob). Второй — флаг в заголовке файла.
Сигнатура версии тоже намекает на memo, но врёт: Visual FoxPro пишет версию 0x30 и таблицам с memo, и без него. Поэтому ориентироваться стоит на фактическое наличие memo-полей, а не на байт версии — иначе вы будете вечно искать несуществующий .fpt.
Что с этим делать дальше
Если текст нужен в другой системе, выгрузите таблицу в формат, где длинный текст — обычное значение: XLSX, CSV или JSON. При обратной выгрузке в DBF memo создаётся заново, и файлы .dbf и .fpt нужно держать вместе — поэтому пара упаковывается в один архив.
Частые вопросы
Можно ли открыть .fpt отдельно от .dbf?
Смысла нет: в .fpt лежат только куски текста без привязки к записям. Связь хранится в самой таблице.
Почему memo-файл больше самой таблицы?
Это нормально: блоки выделяются кратно размеру блока, а удалённый текст физически остаётся в файле до перепаковки.
Правки memo сохраняются?
В TablesViewer пока нет: изменения обычных полей записываются, а правка memo требует перестройки файла .fpt — она в работе.