示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }