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'