Difference between revisions of "DBF Files"
Jump to navigation
Jump to search
PeterHarding (talk | contribs) |
PeterHarding (talk | contribs) |
||
| 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
- 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'