public bool Attach(FileStream stream, string filename, bool read_header) { bool ok = (stream != null); if (ok && read_header) { byte[] bytes = new byte[Marshal.SizeOf(typeof(Byte))]; ok = (bytes.Length == StreamRead(stream, bytes)); if (ok) { Byte version = bytes[0]; int len_header; int len_field; switch (version) { case Const.MAGIC_DBASE4: case Const.MAGIC_DBASE4_MEMO: len_header = Marshal.SizeOf(typeof(DBF_FILEHEADER_4)); len_field = Marshal.SizeOf(typeof(DBF_FILEFIELD_4)); break; case Const.MAGIC_DBASE3: case Const.MAGIC_DBASE3_MEMO: case Const.MAGIC_DBASE3_MEMO_2: case Const.MAGIC_FOXPRO: default: len_header = Marshal.SizeOf(typeof(DBF_FILEHEADER_3)); len_field = Marshal.SizeOf(typeof(DBF_FILEFIELD_3)); break; } bytes = new byte[len_header]; StreamSeek(stream, 0); ok = (len_header == StreamRead(stream, bytes)); if (ok) { switch (version) { case Const.MAGIC_DBASE4: case Const.MAGIC_DBASE4_MEMO: { DBF_FILEHEADER_4 header = Utility.PtrToStructure <DBF_FILEHEADER_4>(bytes); _RecordCount = header.recordcount; RecordLength = header.recordlength; HeaderLength = header.headerlength; ok = sanity_check(header); break; } case Const.MAGIC_DBASE3: case Const.MAGIC_DBASE3_MEMO: case Const.MAGIC_DBASE3_MEMO_2: case Const.MAGIC_FOXPRO: default: { DBF_FILEHEADER_3 header = Utility.PtrToStructure <DBF_FILEHEADER_3>(bytes); _RecordCount = header.recordcount; RecordLength = header.recordlength; HeaderLength = header.headerlength; ok = sanity_check(header); break; } } if (ok) { if ((RecordCount == 0) && (RecordLength != 0)) { _RecordCount = (stream.Length - HeaderLength) / RecordLength; } int fieldcount = (HeaderLength - (len_header + 1)) / len_field; bytes = new byte[len_field]; for (int i = 0; i < fieldcount; i++) { ColumnInfo field; StreamRead(stream, bytes); if ((bytes[0] >= 0) && (bytes[0] <= (byte)' ')) { break; } switch (version) { case Const.MAGIC_DBASE4: case Const.MAGIC_DBASE4_MEMO: { DBF_FILEFIELD_4 item = Utility.PtrToStructure <DBF_FILEFIELD_4>(bytes); DataType type = (DataType)Const.DataTypes.IndexOf(item.type); field = new ColumnInfo() { Name = item.title, DataType = Convert.Type(type), Length = item.length, DecCount = item.deccount }; break; } case Const.MAGIC_DBASE3: case Const.MAGIC_DBASE3_MEMO: case Const.MAGIC_DBASE3_MEMO_2: case Const.MAGIC_FOXPRO: default: { DBF_FILEFIELD_3 item = Utility.PtrToStructure <DBF_FILEFIELD_3>(bytes); DataType type = (DataType)Const.DataTypes.IndexOf(item.type); field = new ColumnInfo() { Name = item.title, DataType = Convert.Type(type), Length = item.length, DecCount = item.deccount }; break; } } Columns.Add(field); } } } } } if (ok) { _Stream = stream; Filename = filename; } return(ok); }