Beispiel #1
0
    /// <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);
        }
    }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
    /// <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);
        }
    }