/// <summary> /// Gets the header from a dbf file. /// </summary> /// <param name="dbfFile">The DBF file.</param> /// <returns></returns> public static dBaseHeader GetHeader(string dbfFile) { if (!File.Exists(dbfFile)) throw new FileNotFoundException(dbfFile + " not found"); dBaseHeader header = new dBaseHeader(); header.ReadHeader(new BinaryReader(new FileStream(dbfFile, FileMode.Open, FileAccess.Read, FileShare.Read))); return header; }
/// <summary> /// /// </summary> /// <param name="header"></param> public void Write(dBaseHeader header) { if (header == null) throw new ArgumentNullException("header"); if (recordsWritten) throw new InvalidOperationException("Records have already been written. Header file needs to be written first."); headerWritten = true; header.WriteHeader(_writer); _header = header; }
/// <summary> /// This will return a copy of the index, but also preserve /// a master copy in this object that is read-only. /// </summary> /// <param name="filename">The filename of the dbf file to index</param> /// <returns>returns a List of long offsets. The index in the list is the row value.</returns> public List<long> GetIndex(string filename) { List<long> OffsetsCopy = new List<long>(); _offsets = new List<long>(); if (filename == null) { throw new ArgumentNullException(filename); } // check for the file existing here, otherwise we will not get an error //until we read the first record or read the header. if (!System.IO.File.Exists(filename)) { throw new System.IO.FileNotFoundException(String.Format("Could not find file \"{0}\"", filename)); } _filename = filename; _header = new dBaseHeader(); // read the header System.IO.FileStream stream = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read); System.IO.BinaryReader binaryreader = new System.IO.BinaryReader(stream); _header.ReadHeader(binaryreader); int iCurrentRecord = 0; long CurrentOffset = _header.HeaderLength; byte DeleteChar = Convert.ToByte('*'); int RowLength = _header.RecordLength; while (iCurrentRecord < _header.NumRecords) { int Val = stream.ReadByte(); if (stream.ReadByte() != DeleteChar) { _offsets.Add(CurrentOffset); OffsetsCopy.Add(CurrentOffset); iCurrentRecord++; } stream.Seek(RowLength - 1, System.IO.SeekOrigin.Current); CurrentOffset += RowLength; } binaryreader.Close(); stream.Close(); binaryreader.Close(); return OffsetsCopy; }
/// <summary> /// Creates a new instance of the commmand server from a file /// </summary> /// <param name="Filename">The filename of the dbf to read, edit or append to</param> public Commands(string Filename) { if (Filename == null) { throw new ArgumentNullException(Filename); } // check for the file existing here, otherwise we will not get an error //until we read the first record or read the header. if (!File.Exists(Filename)) { throw new FileNotFoundException(String.Format("Could not find file \"{0}\"", Filename)); } _Filename = Filename; dBaseReader dr = new dBaseReader(Filename); _Header = dr.GetHeader(); }
/// <summary> /// Gets the header information for the dbase file. /// </summary> /// <returns>DbaseFileHeader contain header and field information.</returns> public dBaseHeader GetHeader() { if (_header==null) { FileStream stream = new FileStream(_filename, System.IO.FileMode.Open); BinaryReader dbfStream = new BinaryReader(stream); _header = new dBaseHeader(); // read the header _header.ReadHeader(dbfStream); dbfStream.Close(); stream.Close(); } return _header; }
/// <summary> /// Initializes a new instance of the ShapefileDataReader class. /// </summary> /// <param name="filename">The shapefile to read (minus the .shp extension)</param> ///<param name="geometryFactory">The GeometryFactory to use.</param> public ShapefileReader(string filename, GeometryFactory geometryFactory) { if (filename == null) throw new ArgumentNullException("filename"); if (geometryFactory == null) throw new ArgumentNullException("geometryFactory"); _geometryFactory = geometryFactory; _open = true; if (filename.ToLower().EndsWith(".shp")) filename = filename.ToLower().Replace(".shp",String.Empty); _dbfReader = new dBaseReader(filename + ".dbf"); _shpReader = new ShapeReader(filename + ".shp", geometryFactory); _dbfHeader = _dbfReader.GetHeader(); _recordCount = _dbfHeader.NumRecords; // copy dbase fields to our own array. Insert into the first position, the shape column _dbaseFields = new FieldDescriptor[_dbfHeader.Fields.Length + 1]; _dbaseFields[0] = FieldDescriptor.ShapeField(); for(int i=0; i < _dbfHeader.Fields.Length; i++) _dbaseFields[i+1] = _dbfHeader.Fields[i]; _ShapeHeader = _shpReader.Header; _dbfEnumerator = _dbfReader.GetEnumerator(); _shpEnumerator = _shpReader.GetEnumerator(); _moreRecords = true; }
/// <summary> /// Writes the entire contents of a data Table to the file. /// This will create a header from the Table information. /// </summary> /// <param name="Table">The Data Table to write.</param> public void Write(System.Data.DataTable Table) { _header = new dBaseHeader(); foreach(System.Data.DataRow dr in Table.Rows) { Write(dr, Table); } }