/// <summary> /// 逐行读取属性记录信息 /// </summary> /// <returns></returns> public DataRow GetNextRow() { var fieldInfos = _header.FieldInfos; if (_dbfTable == null) { _dbfTable = new DataTable(); foreach (var fieldInfo in fieldInfos) { _dbfTable.Columns.Add(fieldInfo.FieldName, FieldTypeTransform.DbfFieldType2CSharpType(fieldInfo)); } //跳过文件头 _reader.BaseStream.Seek(_header.HeaderLength, SeekOrigin.Begin); } var dtRow = _dbfTable.NewRow(); _curRowIndex++; if (_curRowIndex > _header.RecordCount) { dtRow = null; } else { if (_reader.PeekChar() == '*') // DELETED { dtRow = null; } else { var fieldStartIndex = 1; var row = _reader.ReadBytes(_header.RecordLength); foreach (var field in fieldInfos) { byte[] buffer = new byte[field.FieldLength]; //(Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length) Array.Copy(row, fieldStartIndex, buffer, 0, field.FieldLength); fieldStartIndex += field.FieldLength; string text = (Encoding.GetString(buffer) ?? String.Empty).Trim().Replace("\0", ""); var valueObj = GetValueObj(field, text, buffer); dtRow[field.FieldName] = valueObj; } _dbfTable.Rows.Add(dtRow); } } return(dtRow); }
/// <summary> /// 构建文件头字节数组 /// </summary> /// <returns></returns> private (byte[], short) BuildFieldType() { var result = new byte[_dataColumns.Count * 32]; int oneRecordLength = 0; for (int i = 0; i < _dataColumns.Count; i++) { //当前列信息 var column = _dataColumns[i]; var curColumnInfo = new byte[32]; //列名 var fieldNameLength = 11; var fieldName = _encoding.GetBytes(column.ColumnName + "\0"); if (fieldName.Length >= fieldNameLength) { Buffer.BlockCopy(fieldName, 0, curColumnInfo, 0, fieldNameLength); } else { Buffer.BlockCopy(fieldName, 0, curColumnInfo, 0, fieldName.Length); var remainderLength = fieldNameLength - fieldName.Length; var remainderBytes = new byte[remainderLength]; for (int j = 0; j < remainderLength; j++) { remainderBytes[j] = 0; } Buffer.BlockCopy(remainderBytes, 0, curColumnInfo, fieldName.Length, remainderBytes.Length); } //列类型 var dbfFieldInfo = FieldTypeTransform .CSharpType2DbfFieldInfoWithoutName(column.DataType); var dbfFieldType = dbfFieldInfo.FieldType; var fieldLength = dbfFieldInfo.FieldLength; var accuracy = dbfFieldInfo.Accuracy; _fieldInfos.Add(dbfFieldInfo); var dbfType = _encoding.GetBytes(dbfFieldType.ToString())[0]; curColumnInfo[11] = dbfType; //保留字节 12-15 Buffer.BlockCopy(BitConverter.GetBytes(0), 0, curColumnInfo, 12, 4); curColumnInfo[16] = fieldLength; //fieldLength curColumnInfo[17] = accuracy; //accuracy oneRecordLength += fieldLength; //18-31 填充0 for (int j = 18; j < 32; j++) { curColumnInfo[j] = 0; } var offset = i * 32; Buffer.BlockCopy(curColumnInfo, 0, result, offset, 32); } oneRecordLength += 1;//控制位 return(result, (short)oneRecordLength); }