DBF Files
Revision as of 09:54, 7 February 2015 by PeterHarding (talk | contribs)
DBF File Links
FPT File Links
- https://go4answers.webhost4life.com/Example/read-fpt-file-binary-header-91321.aspx
- http://www.clicketyclick.dk/databases/xbase/format/fpt.html
The file format is used by Fox Pro 2.x and later The size of the header is 512 bytes
_______________________ _______ 00h / 0 | Number of next | ^ 00h / 1 | available block | | 00h / 2 | for appending data | Header 00h / 3 | (binary) *1| | |-----------------------| | 00h / 4 | ( Reserved ) | | 00h / 5 | | | |-----------------------| | 00h / 6 | Size of blocks N *1| | 00h / 7 | *2| | |-----------------------| | 00h / 8 | ( Reserved ) | | | | | | | | | (i.e. garbage) | | : : | : : | 00h / 511| | | |=======================| _v_____ 00h / 0| | ^ Used block | | | __ |=======================| | | | / 0| Record type *3| : : | / 1| *1| : : | / 2| | | | | / 3| | 00h / N| | | / |-----------------------| |=======================| _|_____/ 4| Length of memo field | 00h / 0| | | 5| *1| : : | 6| | : : | 7| | | | | |-----------------------| 00h / N| | _|_____ 8| Memo data | |=======================| | \ : : 0| | | \ N| | | | | \_____ |=======================| | | | : : | 00h / N| | _v_____ |=======================|
- Big-endian. Binary value with high byte first.
- Size of blocks in memo file (SET BLOCKSIZE). Default is 512 bytes.
Record type
Value Description 00h Picture. This normally indicates that file is produced on a MacIntosh, since pictures on the DOS/Windows platform are "objects". 01h Memo 02h Object
A memo field can be longer than the 512 byte block. It simply continues through the next block. The field is logically terminated by two End-of-file marks in the field. The reminder of the block is unused.
Code
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] privatestruct DBTHeader { publicInt32 nextBlockID; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] reserved1; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)] public string fileName; public byte version; // 0x03 = Version III, 0x00 = Version IV [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] reserved3; publicInt16 blockLength; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 490)] public byte[] reserved4; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] privatestruct MemoHeader { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] reserved; publicInt16 startPosition; publicInt32 fieldLength; }
void Main() { int[] blocks = {347,750,1095,1439,1781}; List<myData> d = new List<myData>(); using (FileStream fs = File.OpenRead(@"c:\temp\myEmp.fpt")) { d = blocks.Select ((b,i) => new myData { RecNo = i, Content=GetMemo(fs,b)}).ToList(); } } publicstring GetMemo(FileStream stream, int blockNumber) { byte[] blockSize = newbyte[4]; stream.Seek(blockNumber * 64, SeekOrigin.Begin); stream.Seek(4, SeekOrigin.Current); // advance type stream.Read(blockSize, 0, 4); int memoSize = BitConverter.ToInt32( blockSize.Reverse().ToArray(), 0 ); byte[] bytes = newbyte[memoSize]; stream.Read(bytes, 0, memoSize); return Encoding.ASCII.GetString(bytes); } public class myData { public int RecNo { get; set; } public string Content { get; set; } }
You may also view the DBT/FPT file in hexadecimal format in VFP:
DO HOME()+'\tools\hexedit\hexedit.app' WITH 'YourFile.FPT'