Структура файла *.FPT

faustgreen
Дата: 11.08.2012 22:24:03
Хочу разобраться, как работает установка set blocksize. А для этого нужно понять структуру fpt файла. Как я понял из хелпа:

Заголовочная часть (512 байт) + 1-йблок(8 байт служебная информация+56 байт информации) + оставшиеся блоки информации.


Заголовочная часть
00 - 03 байты - Номер первого не использованного блока(точка с которой будет продолжена запись данных)
06 - 07 байты - Размер одного блока в байтах (так понимаю,это то что задается установкой set blocksize)
04 - 05, 08 - 511 - не используются.


1-й блок (8 байт)
00 - 03 - признак того, что содержится в данном поле. (0 - "картинка", поле типа General
1 - текст, поле типа Memo) кстати зачем столько байт, если значения всего 2?
04 - 07 размер всего содержимого в байтах (размер всех данных ?).

ну а теперь вопросы:
Блок информации - это значение мемо-поля одной из записей ?
Например, если в первой записи в таблице в мемо-поле хранится значение - 70 букв "а" , а во 2-й - 70 букв "б". При установке set blocksize 0(по умолчанию - 64 байта), то как будет выглядеть структура fpt файла:

512 байт -заголовок+8 байт служебной информации 1-го блока + 56 байт оставшихся от 1-го блока (56 букв "а")+14 байт 2-го блока(оставшиеся буквы "а")+50 пустых байт 2-го блока+ 64 байта 3-го блока(буквы "б")+16 байт 4-го блока (оставшиеся буквы "б")+54 пустых байта четвертого блока ? Или данные будут идти без разрывов ?

Если структура выглядит, так как я описал - то в таблице в меме-поле хранится информация на начало блока в fpt файле, а как узнать где он заканчивается ? И как влияет на изменение структуры и распределение данных изменение настройки set blocksize ? Если, напрмер, увеличить значение до 100. то в описанном примере данные поместятся в 2 блоках, но уже с другим значением пустых байтов в каждом ?(если так, то при различной длине данных, и размерах блоков количество пустых байт будет всегда разное, как при случае увеличения, так и уменьшения размера блока - как же тогда за счет установки set blocksize можно добиться уменьшения объем fpt файла ?)

Ну и последний вопрос, так информация в мемо-полях не затирается(старый мусор остается), есть ли возможность просмотреть старые данные и при необходимости востановить их ?
ВладимирМ
Дата: 13.08.2012 10:44:29
FPT существует не сам по себе, а как подчиненный файл по отношению к файлу DBF. В самом файле DBF в соответствующем поле записывается номер блока, с которого надо начинать читать информацию в файл FPT, относящуюся к текущей записи.

Как следствие, содержимое другого мемо-поля может начинаться только и исключительно с начала блока. Иначе невозможно реализовать адресацию из файла DBF. Будет непонятно, откуда начинать читать данные.

Возможно, более понятно написано здесь Структура файла Memo (.FPT)

Впрочем, Вам проще будет понять все просто немного поэкспериментировав. Создайте таблицу с одной записью и мемо-полем и экспериментируйте.

В этом Вам дожен помочь любой файловый менеджер, котрый может показывать содержимое файла "как есть". Лучше в 16-разрядном виде, чтобы сразу видеть коды заголовочной части. FAR-manager, Disco-Commander и т.п. Там Вы сразу поймете как можно посмотреть старые данные и можно ли их восстановить.

Можно использовать приложение HexEdit.app, поставляемое вместе с FoxPro

Do (Home()+'tools\hexedit\hexedit.app') with "MyFile.fpt"

Хотя его дизайн не очень-то удобный

PS: Когда будете экспериментировать, то открывайте таблицу в режиме Shared. Это принципиально важно, поскольку в режиме Exclusive есть некоторые отличия в способе записи в мемо-поля.

PPS: Экспериментировать с настройкой SET BLOCKSIZE - не стоит. Сильно сомнительно, что Вы сможете оптимизировать хранение информации в мемо-поле. В общем случае, это возможно только если записываемая информация имеет фиксированную длину. В остальных случаях Вы, скорее, ухудшите "плотность" хранения.