/// <summary>
        /// Method to write <paramref name="header"/> to the dbase stream
        /// </summary>
        /// <param name="header">The header to write</param>
        public void Write(DbaseFileHeader 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;

            //if (header.Encoding.WindowsCodePage != _encoding.WindowsCodePage)
            //{
            //    header.Encoding = _encoding;
            //}

            //header.WriteHeader(_writer);
            //_header = 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;

            // Set the encoding if not already done.
            if (header.Encoding == null)
            {
                header.Encoding = _encoding;
            }

            if (header.Encoding.WindowsCodePage != _encoding.WindowsCodePage)
            {
                header.Encoding = _encoding;
            }

            // Get the current position
            var currentPosition = (int)_writer.BaseStream.Position;

            //Header should always be written first in the file
            if (_writer.BaseStream.Position != 0)
            {
                _writer.Seek(0, SeekOrigin.Begin);
            }

            // actually write the header
            header.WriteHeader(_writer);

            // reposition the stream
            if (currentPosition != 0)
            {
                _writer.Seek(currentPosition, SeekOrigin.Begin);
            }

            _header = header;
        }
 /// <summary>
 ///
 /// </summary>
 /// <param name="header"></param>
 public void Write(DbaseFileHeader 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>
        /// </summary>
        /// <param name="header"></param>
        public void Write(DbaseFileHeader 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;

            if (header.Encoding.WindowsCodePage != _encoding.WindowsCodePage)
            {
                header.Encoding = _encoding;
            }

            header.WriteHeader(_writer);
            _header = header;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="header"></param>
        public void Write(DbaseFileHeader 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;
            
#if !SILVERLIGHT && !PCL
            if (header.Encoding.WindowsCodePage != _encoding.WindowsCodePage)
            {
#else
            if (header.Encoding.WebName != _encoding.WebName)
            {
#endif
                header.Encoding = _encoding;
            }

            header.WriteHeader(_writer);
            _header = header;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="columnValues"></param>
        public void Write(IList columnValues)
        {
            if (columnValues == null)
                throw new ArgumentNullException("columnValues");
            if (!_headerWritten)
                throw new InvalidOperationException("Header records need to be written first.");
            int i = 0;
            _writer.Write((byte)0x20); // the deleted flag
            foreach (object columnValue in columnValues)
            {
                DbaseFieldDescriptor headerField = _header.Fields[i];

                if (columnValue == null)
                    // Don't corrupt the file by not writing if the value is null.
                    // Instead, treat it like an empty string.
                    Write(string.Empty, headerField.Length);
                else if (headerField.Type == typeof(string))
                    // If the column is a character column, the values in that
                    // column should be treated as text, even if the column value
                    // is not a string.
                    Write(columnValue.ToString(), headerField.Length);
                else if (IsRealType(columnValue.GetType()))
                    Write(Convert.ToDecimal(columnValue), headerField.Length, headerField.DecimalCount);
                else if (IsIntegerType(columnValue.GetType()))
                    Write(Convert.ToDecimal(columnValue), headerField.Length, headerField.DecimalCount);
                else if (columnValue is Decimal)
                    Write((decimal)columnValue, headerField.Length, headerField.DecimalCount);
                else if (columnValue is Boolean)
                    Write((bool)columnValue);
                else if (columnValue is string)
                    Write((string)columnValue, headerField.Length);
                else if (columnValue is DateTime)
                    Write((DateTime)columnValue);
                else if (columnValue is Char)
                    Write((Char)columnValue, headerField.Length);

                i++;
            }
        }
        /// <summary>
        /// Method to write <paramref name="header"/> to the dbase stream
        /// </summary>
        /// <param name="header">The header to write</param>
        public void Write(DbaseFileHeader 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;

            //if (header.Encoding.WindowsCodePage != _encoding.WindowsCodePage)
            //{
            //    header.Encoding = _encoding;
            //}

            //header.WriteHeader(_writer);
            //_header = 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;

            if (header.Encoding.WindowsCodePage != _encoding.WindowsCodePage)
            {
                header.Encoding = _encoding;
            }

            // Get the current position
            var currentPosition = (int)_writer.BaseStream.Position;

            //Header should always be written first in the file
            if (_writer.BaseStream.Position != 0)
                _writer.Seek(0, SeekOrigin.Begin);

            // actually write the header
            header.WriteHeader(_writer);

            // reposition the stream
            if (currentPosition != 0)
                _writer.Seek(currentPosition, SeekOrigin.Begin);

            _header = header;

        }