DBF Files

From PeformIQ Upgrade
Revision as of 09:54, 7 February 2015 by PeterHarding (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

DBF File Links

FPT File Links


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'

Tools