// /// <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); }
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; }
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; }
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; }