public void Read(string fileName)
        {
            using (var fileStream = File.OpenRead(fileName))
            {
                using (var reader = new BinaryReader(fileStream, Encoding.Default))
                {
                    var header = new ParadoxFileHeader();
                    header.Read(reader);

                    ReadBlocks(header, reader);
                }
            }
        }
        private void ReadBlocks(ParadoxFileHeader header, BinaryReader reader)
        {
            reader.BaseStream.Seek(0L, SeekOrigin.Begin);

            try
            {
                /*
                 * skip to the first block
                 */
                reader.ReadBytes(header.BlockSizeBytes);

                /*
                 * walk blocks
                 */
                int blocksInUse = header.BlocksInUse;
                for (int i = 0; i < blocksInUse; i++)
                {
                    /*
                     * block
                     */
                    var pdxTableBlock = new ParadoxTableBlock(i + 1, header.CalculateRecordsPerBlock(), header.Fields);

                    var streamPos = reader.BaseStream.Position;

                    /*
                     * read the block data
                     */
                    pdxTableBlock.Read(reader);

                    /*
                     * store it. blocks are numbered from 1, not from 0.
                     */
                    blocks.Add(pdxTableBlock.BlockNumber, pdxTableBlock);

                    /*
                     * reset to the start of the block
                     */
                    reader.BaseStream.Seek(streamPos, SeekOrigin.Begin);

                    /*
                     * skip ahead to next block
                     */
                    reader.ReadBytes(header.BlockSizeBytes);
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Exception in readBlocks", ex);
            }
        }