FPT and DBT files: where the long text of a DBF really lives
If a file with the same name as your table and the extension .fpt or .dbt sits next to it, that is not clutter or a backup. It is the second half of the table, and without it part of the data does not exist.
Why a separate file
Every record in a DBF has the same length — that is what makes the format fast. But long text does not fit that scheme: you cannot declare a 5,000-byte “notes” field when 99% of records have no note.
The solution is simple: the table stores not the text but a block number in a separate file. The field takes 4 or 10 bytes, and text of any length lives next to the table.
Three memo formats
| File | Written by | How it is laid out |
|---|---|---|
.DBT (dBase III) | dBase III+, early Clipper | 512-byte blocks; the text ends with the pair 0x1A 0x1A |
.DBT (dBase IV) | dBase IV and 5 | each block starts with the signature FF FF 08 00, then a length |
.FPT | FoxPro 2.x, Visual FoxPro | block size in the header; every block has a type and a length |
.SMT | Clipper SIX | an eight-byte block header |
The reference stored in the table differs as well: Visual FoxPro writes the block number as four binary bytes, while FoxPro 2.x and dBase use ten digit characters. The two cannot be mixed up — the same field would read as either text or garbage.
Why the text is blank
Three common causes, in order of frequency:
- The memo file is missing. Only the .dbf was copied; the text stayed behind. The fix is to move both files. In Tabulens, drag them in together or open the whole folder.
- The program cannot read that memo variant. General-purpose viewers often support only the dBase III .DBT and show a block number instead of text.
- The memo file is truncated or damaged. It happens when files are copied while the program that owns them is running. Some records read, others do not.
How to tell whether a table has memo at all
There are two signs. The first is the field type in the table structure: M (memo), G (general), P (picture) or W (blob). The second is a flag in the file header.
The version byte hints at memo too, but misleads: Visual FoxPro writes version 0x30 for tables with and without memo. Go by the actual memo fields, not the version — otherwise you will keep hunting for a .fpt that was never there.
What to do with it
If you need the text elsewhere, export the table to a format where long text is an ordinary value: XLSX, CSV or JSON. When exporting back to DBF, the memo is created anew, and the .dbf and .fpt files have to be kept together — which is why the pair is packed into one archive.
FAQ
Can I open an .fpt file on its own?
There is little point: an .fpt holds chunks of text with no link to records. The link is stored in the table itself.
Why is the memo file larger than the table?
That is normal. Blocks are allocated in multiples of the block size, and deleted text physically stays in the file until the memo is rebuilt.
Do indexes (.cdx) have anything to do with memo files?
No. A .cdx is an index for fast lookup and sorting; memo files carry text. A table can have either, both or neither.
Free for personal use. Your file is not uploaded to a server. Windows version — 3.5 MB, no installation: details. Organizations: license.