Difference between revisions of "DBF Files"

From PeformIQ Upgrade
Jump to navigation Jump to search
 
Line 6: Line 6:


* https://go4answers.webhost4life.com/Example/read-fpt-file-binary-header-91321.aspx
* 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
<pre>
          _______________________  _______
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_____
          |=======================|
</pre>
* 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.




Line 37: Line 98:
}
}
</pre>
</pre>
<pre>
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; }
}
</pre>





Latest revision as of 09:54, 7 February 2015

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