コード例 #1
0
ファイル: DbfFile.cs プロジェクト: itplaygroundth/MultiShop
        private void WriteHeader(Stream stream, bool withColumns)
        {
            mDbfHeader.NbRecords = (UInt32)mRecordCount;

            UInt16 newHeaderWith = (UInt16)(mDbfHeaderWriter.RecordWidth + (mColumns.Count - 1) * mDbfColumnWriter.RecordWidth + 1);

            mDbfHeader.HeaderWidth = newHeaderWith;
            mHeaderWidth           = newHeaderWith;

            Byte[] headerBuff = new byte[mDbfHeaderWriter.RecordWidth];
            mDbfHeaderWriter.Write(this, headerBuff, mDbfHeader);

            stream.Seek(0, SeekOrigin.Begin);
            stream.Write(headerBuff, 0, headerBuff.Length);
#if DUMP_DISK_ACTIVITY
            System.Diagnostics.Debug.WriteLine(mOriginalFile + " WriteHeader");
            System.Diagnostics.Debug.WriteLine(Utils.HexDump(headerBuff));
#endif

            if (withColumns)
            {
                Byte[]          columnHeaderBuff = new byte[mDbfColumnWriter.RecordWidth];
                DbfColumnHeader dbfColumnHeader  = new DbfColumnHeader();
                // we ignore column 0
                for (int i = 1; i < mColumns.Count; i++)
                {
                    ColumnDefinition c = mColumns[i];
                    dbfColumnHeader.ColumnName  = c.mColumnName;
                    dbfColumnHeader.ColumnType  = c.DbfColumnType;
                    dbfColumnHeader.ColumnWidth = (byte)c.mWidth;
                    dbfColumnHeader.Decimals    = (byte)c.mDecimals;

                    mDbfColumnWriter.Write(this, columnHeaderBuff, dbfColumnHeader);
                    stream.Write(columnHeaderBuff, 0, columnHeaderBuff.Length);
#if DUMP_DISK_ACTIVITY
                    System.Diagnostics.Debug.WriteLine(mOriginalFile + " WriteColumn #" + i);
                    System.Diagnostics.Debug.WriteLine(Utils.HexDump(columnHeaderBuff));
#endif
                }
                stream.WriteByte(END_OF_COLUMN_DEFINITIONS);
            }
            base.mCurrentRecordNoPosition = UInt32.MaxValue;
        }
コード例 #2
0
ファイル: DbfFile.cs プロジェクト: itplaygroundth/MultiShop
        protected override void OnInitialize(Stream stream)
        {
            Byte[] headerBuff = new byte[mDbfHeaderWriter.RecordWidth];
            mDbfHeader = new DbfHeader();
            int read = stream.Read(headerBuff, 0, headerBuff.Length);

            if (read > 0)
            {
                mDbfHeaderWriter.Read(this, headerBuff, mDbfHeader);
                //File size reported by the operating system must match the logical file size. Logical file size = ( Length of header + ( Number of records * Length of each record ) )
                //mHeaderSerializer.mQuickWriteMethod(this, headerBuff, header);
                var nbColumns   = ((mDbfHeader.HeaderWidth - mDbfHeaderWriter.RecordWidth) / mDbfColumnWriter.RecordWidth) + 1;
                var totalLength = stream.Length;
                mRecordWidth = mDbfHeader.RecordWidth;
                var recordsLength = totalLength - mDbfHeader.HeaderWidth;
                if (mRecordWidth > 0)
                {
                    var columns = new List <ColumnDefinition>(nbColumns);
                    mRecordCount = (UInt32)(recordsLength / mRecordWidth);

                    Byte[]           columnHeaderBuff = new byte[mDbfColumnWriter.RecordWidth];
                    DbfColumnHeader  dbfColumnHeader  = new DbfColumnHeader();
                    ColumnDefinition columnDefinition = null;
                    //new ColumnDefinition();
                    //columnDefinition.Initialize(DbfVersion.dBaseIII, 0, typeof(DbfRecord).GetField("DeletedFlag",
                    //    BindingFlags.Instance
                    //   | BindingFlags.Public
                    //   | BindingFlags.NonPublic
                    //   | BindingFlags.DeclaredOnly), 0, null);
                    //columns.Add(columnDefinition);

                    for (int i = 1; i < nbColumns; i++)
                    {
                        read = stream.Read(columnHeaderBuff, 0, columnHeaderBuff.Length);
                        mDbfColumnWriter.Read(this, columnHeaderBuff, dbfColumnHeader);
                        System.Diagnostics.Trace.WriteLine(string.Format("{0},{1},{2},{3}",
                                                                         dbfColumnHeader.ColumnName,
                                                                         dbfColumnHeader.ColumnType,
                                                                         dbfColumnHeader.ColumnWidth,
                                                                         dbfColumnHeader.Decimals));

                        columnDefinition = new ColumnDefinition();
                        columnDefinition.Initialize(dbfColumnHeader.ColumnName, dbfColumnHeader.ColumnType, dbfColumnHeader.ColumnWidth, dbfColumnHeader.Decimals);
                        columns.Add(columnDefinition);
                    }
                    int lastByte = stream.ReadByte();
                    if (lastByte == END_OF_COLUMN_DEFINITIONS)
                    {
                        mColumns     = columns;
                        mHeaderWidth = mDbfHeader.HeaderWidth;
                    }
                }
            }
            mRecordWriter = new QuickSerializer(
                typeof(TRecord),
                mVersion,
                mColumns,
                mRecordWidth,
                false,
                true);

            if (mColumns == null)
            {
                mColumns     = mRecordWriter.Columns;
                mRecordWidth = mRecordWriter.RecordWidth;

                mDbfHeader.VerNumber  = 131;
                mDbfHeader.LastUpdate = DateTime.Now;
                mDbfHeader.NbRecords  = 0;
                var nbColumns = mColumns.Count;
                mDbfHeader.HeaderWidth           = (UInt16)(mDbfHeaderWriter.RecordWidth + mDbfColumnWriter.RecordWidth * nbColumns + 1);
                mDbfHeader.RecordWidth           = (UInt16)mRecordWriter.RecordWidth;
                mDbfHeader.Zero                  = 0;
                mDbfHeader.IncompleteTransaction = 0;
                mDbfHeader.EncryptionFlag        = 0;
                //mDbfHeader.LanOnly = [];
                mDbfHeader.Indexed  = 0;
                mDbfHeader.Language = 0;
                mDbfHeader.Zero2    = 0;

                WriteHeader(stream, /*withColumns*/ true);
            }
        }