/// <summary> /// 将DataTable加载到Bin. /// </summary> /// <param name="table">DataTable</param> /// <param name="fullSavePath">保存路径</param> /// <param name="structType">结构体类型</param> /// <returns>导出成功true;导出失败false</returns> public static bool LoadBinToTable(ref DataTable table, string fullSavePath, Type structType) { if (!ArgumentChecked(table, fullSavePath)) { return(false); } table.Clear(); FileStream _readObj = null; try { using (_readObj = new FileStream(fullSavePath, FileMode.Open, FileAccess.Read)) { BIN_FILE_HEADER header = new BIN_FILE_HEADER(); ReadStruct(ref header, _readObj); if (!header.szMagicFlag.Equals("BIN")) { Trace.Error("bin文件的szMagicFlag不一致!:[" + header.szMagicFlag + "," + "BIN" + "]"); return(false); } if (!header.szTypeName.Equals(structType.Name)) { Trace.Error("bin文件的szTypeName不一致!:[" + header.szTypeName + "," + structType.Name + "]"); return(false); } if (header.nTypeSize != Marshal.SizeOf(structType)) { Trace.Error("bin文件的nTypeSize不一致!:[" + header.nTypeSize + "," + Marshal.SizeOf(structType) + "]"); return(false); } FieldInfo[] fields = structType.GetFields(); // 逐个输入 for (int i = 0; i < header.nItemTotal; i++) { Object structTypeInstance = Activator.CreateInstance(structType); ReadStructFromType(ref structTypeInstance, _readObj, structType); DataRow _row = table.NewRow(); int rowNum = 0; for (int j = 0; j < fields.Length; j++) { _row[rowNum] = fields[j].GetValue(structTypeInstance); rowNum++; if (rowNum == 2) //跳过备注这一行 { rowNum++; } } table.Rows.Add(_row); } return(true); } } catch (Exception e) { Trace.Error(e.Message); return(false); } }
/// <summary> /// 加载bin的条件table /// </summary> /// <param name="tableArray">table数组</param> /// <param name="filePath">文件路径</param> /// <returns></returns> private bool LoadConditionTableFromBinImp(string filePath) { if (string.IsNullOrEmpty(filePath)) { return(false); } if (!File.Exists(filePath)) { Trace.Error("文件不存在:" + filePath); return(false); } FileStream _readObj = null; try { using (_readObj = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { foreach (KeyValuePair <string, DataTable> kv in mConditionSet) { BIN_FILE_HEADER header = new BIN_FILE_HEADER(); //已经读取完了,跳出 if (DataTableSerializer.ReadStruct(ref header, _readObj) <= 0) { break; } if (!mConditionSet.ContainsKey(header.szTypeName)) { Trace.Error("加载bin格式的条件时遇到无法识别的类型:" + header.szTypeName); continue; } DataTable table = mConditionSet[header.szTypeName]; Type structType = m_ConditionType[header.szTypeName]; table.Clear(); FieldInfo[] fields = structType.GetFields(); // 逐个输入 for (int i = 0; i < header.nItemTotal; i++) { Object structTypeInstance = Activator.CreateInstance(structType); DataTableSerializer.ReadStructFromType(ref structTypeInstance, _readObj, structType); DataRow _row = table.NewRow(); for (int j = 0; j < fields.Length; j++) { _row[j] = fields[j].GetValue(structTypeInstance); //第一个是技能ID if (j == 0) { //取出最大的ID uint Id = Convert.ToUInt32(_row[j]); m_IDIDAllocator.PushUsedId(Id); } } table.Rows.Add(_row); } } } } catch (Exception e) { Trace.Error(e.Message); return(false); } return(true); }
/// <summary> /// 将DataTable导出到BIN. /// </summary> /// <param name="table">数据表</param> /// <param name="fullSavePath">保存路径</param> /// <param name="ItemTotal">数量</param> /// <param name="structType">结构类型</param> /// <param name="structType">打开类型</param> /// <returns></returns> public static bool SaveToBin(DataTable table, string fullSavePath, Type structType, FileMode openMode = FileMode.OpenOrCreate) { if (!ArgumentChecked(table, fullSavePath)) { return(false); } FileStream _writerObj = null; try { //没有数据 if (table.Rows.Count <= 0) { Trace.Warring(fullSavePath + "没有数据,不需要保存"); return(false); } using (_writerObj = new FileStream(fullSavePath, openMode, FileAccess.Write)) { BIN_FILE_HEADER header = new BIN_FILE_HEADER(); header.szMagicFlag = "BIN"; header.szTypeName = structType.Name; header.nTypeSize = Marshal.SizeOf(structType); header.nItemTotal = table.Rows.Count; WriteStruct(ref header, _writerObj); FieldInfo[] fields = structType.GetFields(); // 逐个输出 for (int i = 0; i < table.Rows.Count; i++) { Object obj = Activator.CreateInstance(structType); foreach (var field in fields) { //枚举类型要特殊处理 if (IsEnum(field.FieldType)) { Object o = Enum.ToObject(field.FieldType, table.Rows[i][field.Name]); field.SetValue(obj, o); } else { object val = Convert.ChangeType(table.Rows[i][field.Name], field.FieldType); if (field.FieldType.FullName == "System.String") { Object[] attrs = field.GetCustomAttributes(false); if (attrs[0].GetType() == typeof(MarshalAsAttribute)) { MarshalAsAttribute attr = (MarshalAsAttribute)(attrs[0]); int sizeConst = attr.SizeConst; if (sizeConst < val.ToString().Length) { Trace.Error("字符串长度过长!超出了当前字符串最大长度,请联系程序扩充!: \n 类型: " + header.szTypeName + "\n 字符串: " + val.ToString()); return(false); } } } field.SetValue(obj, val); } } WriteStruct(ref obj, _writerObj); } return(true); } } catch (Exception e) { Trace.Error(e.Message); //删除文件 _writerObj.Close(); if (File.Exists(fullSavePath)) { File.Delete(fullSavePath); } return(false); } }