Exemple #1
0
        //

        /// <summary>
        /// Create a new DBF datafile.
        /// Create() can't overwrite exists file - it's a precautionary measure.
        /// </summary>
        /// <param name="path">A not exists filename.</param>
        /// <param name="columns">Definition of columns</param>
        /// <param name="encoding">Encoding for open created file. -- It mean too, CodepageCodes of new file will OEM</param>
        /// <returns></returns>
        public static DbfTable Create(string path, IEnumerable <ColumnDefinitionForCreateTable> columns, Encoding encoding, DbfTableType tableType = DbfTableType.Undefined)
        {
            if (string.IsNullOrEmpty(path))
            {
                throw new ArgumentNullException("path");
            }

            if (columns == null)
            {
                throw new ArgumentNullException("columns");
            }

            //

            var streamDBF = new FileStream(path, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.None);

            DbfTable dbfTable = CreateHeader_DBF(streamDBF, columns, tableType, CodepageCodes.OEM, encoding);

            if (dbfTable.isExistsMemoField)
            {
                MemoFileType memoType = dbfTable.DefaultMemoFileFormatForDbf();

                Stream streamMemo = CreateHeader_Memo(path, memoType);
                dbfTable.JoinMemoStream(streamMemo, memoType);
            }

            return(dbfTable);
        }
Exemple #2
0
 internal DbfTableParametersReadOnly(DbfTableParameters parameters)
 {
     encoding        = parameters.encoding;
     openMemo        = parameters.openMemo;
     strictHeader    = parameters.strictHeader;
     tableType       = parameters.tableType;
     memoType        = parameters.memoType;
     indexType       = parameters.indexType;
     memoTerminators = parameters.memoTerminators;
     openMode        = parameters.openMode;
 }
Exemple #3
0
        public DbfTableParameters(DbfTableOpenMode?openmode = null, Encoding encoding     = null, bool?openMemo           = null, StrictHeader?strictHeader = null,
                                  DbfTableType?tableType    = null, MemoFileType?memoType = null, IndexFileType?indexType = null)
        {
            _encoding        = null;
            _openMemo        = false;
            _strictHeader    = 0;
            _tableType       = 0;
            _memoType        = 0;
            _indexType       = 0;
            _memoTerminators = 0;
            _openMode        = 0;

            //

            this.encoding     = encoding;                                       // null value mean "ReadDbfHeader_Encoding(_header.codepageCode)" will work
            this.openMemo     = openMemo ?? defaultOpenMemo;
            this.strictHeader = strictHeader ?? defaultStrictHeader;
            this.tableType    = tableType ?? defaultTableType;
            this.memoType     = memoType ?? defaultMemoType;
            this.indexType    = indexType ?? defaultIndexType;

            this.memoTerminators = defaultMemoTerminators;
            this.openMode        = openmode ?? defaultOpenMode;
        }
Exemple #4
0
        public MemoFileDBT(Stream stream, Encoding encoding, MemoFileType memoType, StrictHeader?strictHeader)
            : base(stream, encoding)
        { // 'stream', 'encoding' already stored by base class constructor
            if (memoType == MemoFileType.Undefined)
            {
                memoType = RetrieveDbtVersion(stream);
            }

            this.memoType = memoType;

            switch (memoType)
            {
            case MemoFileType.DBT_Ver3:
                if (stream.Length < 512)
                {
                    throw new Exception("DBT MemoStream length too short! [header ver3] [" + stream.Length + " < 512]");
                }
                break;

            case MemoFileType.DBT_Ver4:
            case MemoFileType.FPT_Ver3:
                if (stream.Length < 64)
                {
                    throw new Exception("DBT MemoStream length too short! [header ver4] [" + stream.Length + " < 64]");
                }
                break;

            case MemoFileType.Undefined:
                throw new Exception("MemoFileDBT: Undefined MemoFileType!");

            default:
                throw new Exception("MemoFileDBT: Invalid MemoFileType! [" + memoType + "]");
            }


            this.strictHeader = strictHeader ?? defaultStrictHeader;

            BinaryReader reader = new BinaryReader(stream); // don't use using '(BinaryReader reader...' because 'using' dispose 'stream' too!

            {                                               // http://www.clicketyclick.dk/databases/xbase/format/dbt.html#DBT_STRUCT
                reader.BaseStream.Position = 16;
                byte versionByte = reader.ReadByte();       // dBase3:0x03   dBase4: 0x00

                if (memoType == MemoFileType.DBT_Ver4)
                {
                    reader.BaseStream.Position = 6;
                    this.blockSize             = reader.ReadInt16(); // FP:
                }
                else
                {
                    reader.BaseStream.Position = 20;
                    this.blockSize             = reader.ReadInt16(); // dBase3:512
                }

                if (this.strictHeader > StrictHeader.none)
                {
                    switch (memoType)
                    {
                    case MemoFileType.DBT_Ver3:
                        if ((versionByte != 0x03) && (this.strictHeader > StrictHeader.medium))
                        {
                            throw new Exception("MemoFileDBT: Invalid Memo File version byte! [" + versionByte +
                                                " is not 3]");
                        }

                        if (blockSize != 512)
                        {
                            if (this.strictHeader > StrictHeader.medium)
                            {
                                throw new Exception("MemoFileDBT: Invalid Memo File block size! [" + blockSize +
                                                    " is not 512]");
                            }

                            blockSize = 512;
                        }

                        if ((this.strictHeader >= StrictHeader.weak) && (!CheckDbtFileBlocks(stream, blockSize)))
                        {
                            throw new Exception("MemoFileDBT: Invalid Memo File length! [" + stream.Length + "/" +
                                                blockSize + "]");
                        }

                        if ((this.strictHeader >= StrictHeader.potent) && (!CheckDbtFileAdmLength(stream)))
                        {
                            throw new Exception("MemoFileDBT: Invalid Memo File length! [next block]");
                        }
                        break;

                    case MemoFileType.DBT_Ver4:
                        if ((this.strictHeader >= StrictHeader.weak) && (versionByte != 0x00))
                        {
                            throw new Exception("MemoFileDBT: Invalid Memo File version byte! [" + versionByte +
                                                " is not 0]");
                        }

                        if ((blockSize < 64) || (blockSize > 64 * 512) || ((blockSize % 64) != 0))
                        {
                            // Can't read/write if blockSize unknown
                            throw new Exception("MemoFileDBT: Invalid Memo File block size! [" + blockSize +
                                                " is not 512]");
                        }

                        if ((this.strictHeader >= StrictHeader.medium) && (!CheckDbtFileBlocks(stream, blockSize)))
                        {
                            throw new Exception("MemoFileDBT: Invalid Memo File length! [" + stream.Length + "/" +
                                                blockSize + "]");
                        }

                        if ((this.strictHeader >= StrictHeader.potent) && (!CheckDbtFileAdmLength(stream)))
                        {
                            throw new Exception("MemoFileDBT: Invalid Memo File length! [next block]");
                        }
                        break;

                    case MemoFileType.FPT_Ver3:
                        if ((this.strictHeader >= StrictHeader.weak) && (versionByte != 0x00))
                        {
                            throw new Exception("MemoFileDBT: Invalid Memo File version byte! [" + versionByte +
                                                " is not 0]");
                        }

                        if ((blockSize < 64) || (blockSize > 64 * 512) || ((blockSize % 64) != 0))
                        {
                            // Can't read/write if blockSize unknown
                            throw new Exception("MemoFileDBT: Invalid Memo File block size! [" + blockSize +
                                                " is not multiply of 64]");
                        }

                        if ((this.strictHeader >= StrictHeader.medium) && (!CheckDbtFileBlocks(stream, blockSize)))
                        {
                            throw new Exception("MemoFileDBT: Invalid Memo File length! [" + stream.Length + "/" +
                                                blockSize + "]");
                        }

                        if ((this.strictHeader >= StrictHeader.potent) && (!CheckDbtFileAdmLength(stream)))
                        {
                            throw new Exception("MemoFileDBT: Invalid Memo File length! [next block]");
                        }
                        break;

                    default:
                        Debug.Fail("invalid case");
                        break;
                    }
                }
            }

            stream.Position = 0;
        }