/// <summary> /// Создать таблицу, состоящую из одного среза, в файле или потоке /// </summary> /// <remarks>Для записи таблицы текущего среза</remarks> public void Create(SrezTable.Srez srez, DateTime srezDT) { if (srez == null) { throw new ArgumentNullException("srez"); } Stream stream = null; BinaryWriter writer = null; try { stream = ioStream == null ? new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite) : ioStream; writer = new BinaryWriter(stream); writer.Write(GetSrezDescrBuf(srez.SrezDescr)); writer.Write(Arithmetic.EncodeDateTime(srezDT)); writer.Write(GetCnlDataBuf(srez.CnlData)); stream.SetLength(stream.Position); } finally { if (fileMode) { if (writer != null) { writer.Close(); } if (stream != null) { stream.Close(); } } } }
/// <summary> /// Создать буфер для записи события /// </summary> protected byte[] CreateEventBuffer(EventTableLight.Event ev) { byte[] evBuf = new byte[EventDataSize]; Array.Copy(BitConverter.GetBytes(Arithmetic.EncodeDateTime(ev.DateTime)), 0, evBuf, 0, 8); evBuf[8] = (byte)(ev.ObjNum % 256); evBuf[9] = (byte)(ev.ObjNum / 256); evBuf[10] = (byte)(ev.KPNum % 256); evBuf[11] = (byte)(ev.KPNum / 256); evBuf[12] = (byte)(ev.ParamID % 256); evBuf[13] = (byte)(ev.ParamID / 256); evBuf[14] = (byte)(ev.CnlNum % 256); evBuf[15] = (byte)(ev.CnlNum / 256); Array.Copy(BitConverter.GetBytes(ev.OldCnlVal), 0, evBuf, 16, 8); evBuf[24] = (byte)ev.OldCnlStat; Array.Copy(BitConverter.GetBytes(ev.NewCnlVal), 0, evBuf, 25, 8); evBuf[33] = (byte)ev.NewCnlStat; evBuf[34] = ev.Checked ? (byte)1 : (byte)0; evBuf[35] = (byte)(ev.UserID % 256); evBuf[36] = (byte)(ev.UserID / 256); string descr = ev.Descr ?? ""; if (descr.Length > MaxDescrLen) { descr = descr.Substring(0, MaxDescrLen); } evBuf[37] = (byte)descr.Length; Array.Copy(Encoding.Default.GetBytes(descr), 0, evBuf, 38, descr.Length); string data = ev.Data ?? ""; if (data.Length > MaxDataLen) { data = data.Substring(0, MaxDataLen); } evBuf[138] = (byte)data.Length; Array.Copy(Encoding.Default.GetBytes(data), 0, evBuf, 139, data.Length); return(evBuf); }
/// <summary> /// Записать изменения таблицы срезов в файл или поток /// </summary> public void Update(SrezTable srezTable) { if (srezTable == null) { throw new ArgumentNullException("srezTable"); } Stream stream = null; BinaryWriter writer = null; try { stream = ioStream == null ? new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite) : ioStream; writer = new BinaryWriter(stream); // запись изменённых срезов foreach (SrezTable.Srez srez in srezTable.ModifiedSrezList) { stream.Seek(srez.Position + 8, SeekOrigin.Begin); writer.Write(GetCnlDataBuf(srez.CnlData)); } // установка позиции записи добавленных срезов в поток, // восстановление таблицы срезов в случае необходимости SrezTable.Srez lastSrez = srezTable.LastStoredSrez; if (lastSrez == null) { stream.Seek(0, SeekOrigin.Begin); } else { stream.Seek(0, SeekOrigin.End); long offset = lastSrez.Position + lastSrez.CnlNums.Length * 9 + 8; if (stream.Position < offset) { byte[] buf = new byte[offset - stream.Position]; stream.Write(buf, 0, buf.Length); } else { stream.Seek(offset, SeekOrigin.Begin); } } // запись добавленных срезов SrezTable.SrezDescr prevSrezDescr = lastSrez == null ? null : lastSrez.SrezDescr; foreach (SrezTable.Srez srez in srezTable.AddedSrezList) { // запись номеров каналов среза if (srez.SrezDescr.Equals(prevSrezDescr)) { writer.Write(EmptyCnlNumsBuf); } else { writer.Write(GetSrezDescrBuf(srez.SrezDescr)); } prevSrezDescr = srez.SrezDescr; // запись данных среза srez.Position = stream.Position; writer.Write(Arithmetic.EncodeDateTime(srez.DateTime)); writer.Write(GetCnlDataBuf(srez.CnlData)); lastSrez = srez; } // подтверждение успешного сохранения изменений srezTable.AcceptChanges(); srezTable.LastStoredSrez = lastSrez; } finally { if (fileMode) { if (writer != null) { writer.Close(); } if (stream != null) { stream.Close(); } } } }
/// <summary> /// Записать таблицу dataTable в файл или поток /// </summary> public void Update(DataTable dataTable) { if (dataTable == null) { throw new ArgumentNullException("dataTable"); } Stream stream = null; BinaryWriter writer = null; try { stream = ioStream == null ? new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite) : ioStream; writer = new BinaryWriter(stream, Encoding.Default); // запись заголовка byte fieldCnt = dataTable.Columns.Count > byte.MaxValue ? byte.MaxValue : (byte)dataTable.Columns.Count; writer.Write(fieldCnt); writer.Write((ushort)0); // резерв if (fieldCnt > 0) { // формирование и запись определений полей FieldDef[] fieldDefs = new FieldDef[fieldCnt]; int recSize = 2; // размер строки в файле byte[] fieldDefBuf = new byte[FieldDefSize]; fieldDefBuf[FieldDefSize - 1] = fieldDefBuf[FieldDefSize - 2] = 0; // резерв for (int i = 0; i < fieldCnt; i++) { FieldDef fieldDef = new FieldDef(); DataColumn col = dataTable.Columns[i]; Type type = col.DataType; if (type == typeof(int)) { fieldDef.DataType = DataTypes.Integer; fieldDef.DataSize = sizeof(int); fieldDef.MaxStrLen = 0; } else if (type == typeof(double)) { fieldDef.DataType = DataTypes.Double; fieldDef.DataSize = sizeof(double); fieldDef.MaxStrLen = 0; } else if (type == typeof(bool)) { fieldDef.DataType = DataTypes.Boolean; fieldDef.DataSize = 1; fieldDef.MaxStrLen = 0; } else if (type == typeof(DateTime)) { fieldDef.DataType = DataTypes.DateTime; fieldDef.DataSize = sizeof(double); fieldDef.MaxStrLen = 0; } else // String { fieldDef.DataType = DataTypes.String; int maxLen = Math.Min(col.MaxLength, MaxStringLen); fieldDef.DataSize = 2 /*запись длины*/ + Encoding.UTF8.GetMaxByteCount(maxLen); fieldDef.MaxStrLen = maxLen; } fieldDef.Name = col.ColumnName; fieldDef.AllowNull = col.AllowDBNull; recSize += fieldDef.DataSize; if (fieldDef.AllowNull) { recSize++; } fieldDefs[i] = fieldDef; fieldDefBuf[0] = (byte)fieldDef.DataType; Array.Copy(BitConverter.GetBytes((ushort)fieldDef.DataSize), 0, fieldDefBuf, 1, 2); Array.Copy(BitConverter.GetBytes((ushort)fieldDef.MaxStrLen), 0, fieldDefBuf, 3, 2); fieldDefBuf[5] = fieldDef.AllowNull ? (byte)1 : (byte)0; ConvertStr(fieldDef.Name, MaxFieldNameLen, MaxFieldNameDataSize, fieldDefBuf, 6, Encoding.ASCII); writer.Write(fieldDefBuf); } // запись строк byte[] rowBuf = new byte[recSize]; rowBuf[0] = rowBuf[1] = 0; // резерв foreach (DataRowView rowView in dataTable.DefaultView) { DataRow row = rowView.Row; int bufInd = 2; foreach (FieldDef fieldDef in fieldDefs) { int colInd = dataTable.Columns.IndexOf(fieldDef.Name); object val = colInd >= 0 ? row[colInd] : null; bool isNull = val == null || val == DBNull.Value; if (fieldDef.AllowNull) { rowBuf[bufInd++] = isNull ? (byte)1 : (byte)0; } switch (fieldDef.DataType) { case DataTypes.Integer: int intVal = isNull ? 0 : (int)val; Array.Copy(BitConverter.GetBytes(intVal), 0, rowBuf, bufInd, fieldDef.DataSize); break; case DataTypes.Double: double dblVal = isNull ? 0.0 : (double)val; Array.Copy(BitConverter.GetBytes(dblVal), 0, rowBuf, bufInd, fieldDef.DataSize); break; case DataTypes.Boolean: rowBuf[bufInd] = (byte)(isNull ? 0 : (bool)val ? 1 : 0); break; case DataTypes.DateTime: double dtVal = isNull ? 0.0 : Arithmetic.EncodeDateTime((DateTime)val); Array.Copy(BitConverter.GetBytes(dtVal), 0, rowBuf, bufInd, fieldDef.DataSize); break; default: string strVal = isNull ? "" : val.ToString(); ConvertStr(strVal, fieldDef.MaxStrLen, fieldDef.DataSize, rowBuf, bufInd, Encoding.UTF8); break; } bufInd += fieldDef.DataSize; } writer.Write(rowBuf); } } } finally { if (fileMode) { if (writer != null) { writer.Close(); } if (stream != null) { stream.Close(); } } } }