博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
读写INI的通用函数
阅读量:6010 次
发布时间:2019-06-20

本文共 4663 字,大约阅读时间需要 15 分钟。

转自前辈的博客,反复搜索了一下,可能是这里原创.

在写到INI文件读写的时候,发现好多重复的语句,原代码类似这样的好多:

IniGameConf := Tinifile.Create(sIniFile + M2SERVERCONFIGFILE);  IniGameConf.WriteString(M2SERVERSECTIONNAME1, 'ServerName', g_sGameName);  IniGameConf.WriteString(M2SERVERSECTIONNAME1, 'DBName', g_sHeroDBName);  IniGameConf.WriteString(M2SERVERSECTIONNAME1, 'GateAddr', sAllIPaddr);  IniGameConf.WriteInteger(M2SERVERSECTIONNAME1, 'GatePort', g_Config.M2Server.GatePort);  IniGameConf.WriteString(M2SERVERSECTIONNAME1, 'DBAddr', sLocalIPaddr);  IniGameConf.WriteInteger(M2SERVERSECTIONNAME1, 'DBPort', g_Config.DBServer.ServerPort);  IniGameConf.WriteString(M2SERVERSECTIONNAME1, 'IDSAddr', sLocalIPaddr);  IniGameConf.WriteInteger(M2SERVERSECTIONNAME1, 'IDSPort', g_Config.LoginSrv.ServerPort);  IniGameConf.WriteString(M2SERVERSECTIONNAME1, 'MsgSrvAddr', sAllIPaddr);  IniGameConf.WriteInteger(M2SERVERSECTIONNAME1, 'MsgSrvPort', g_Config.M2Server.MsgSrvPort);  IniGameConf.WriteString(M2SERVERSECTIONNAME1, 'LogServerAddr', sLocalIPaddr);  IniGameConf.WriteInteger(M2SERVERSECTIONNAME1, 'LogServerPort', g_Config.LogServer.Port);  IniGameConf.WriteBool(M2SERVERSECTIONNAME1, 'CloseWuXin', g_boCloseWuXin);  IniGameConf.WriteString(M2SERVERSECTIONNAME2, 'GuildDir', '.\GuildBase\Guilds\');  IniGameConf.WriteString(M2SERVERSECTIONNAME2, 'GuildFile', '.\GuildBase\GuildList.txt');  IniGameConf.WriteString(M2SERVERSECTIONNAME2, 'ConLogDir', '.\ConLog\');  IniGameConf.WriteString(M2SERVERSECTIONNAME2, 'CastleDir', '.\Castle\');  IniGameConf.WriteString(M2SERVERSECTIONNAME2, 'CastleFile', '.\Castle\List.txt');  IniGameConf.WriteString(M2SERVERSECTIONNAME2, 'GameDataDir', '.\Envir\');  IniGameConf.WriteString(M2SERVERSECTIONNAME2, 'EnvirDir', '.\Envir\');  IniGameConf.WriteString(M2SERVERSECTIONNAME2, 'MapDir', '.\Map\');  IniGameConf.WriteString(M2SERVERSECTIONNAME2, 'NoticeDir', '.\Notice\');  IniGameConf.WriteString(M2SERVERSECTIONNAME2, 'LogDir', '.\Log\');  IniGameConf.WriteString(M2SERVERSECTIONNAME2, 'EMailDir', '.\EMail\');  IniGameConf.Free;  sIniFile := g_sGameDirectory + 'Mir200\' + 'GuildBase\';  if not DirectoryExists(sIniFile) then begin    CreateDir(sIniFile);  end;  sIniFile := g_sGameDirectory + 'Mir200\' + 'GuildBase\Guilds\';  if not DirectoryExists(sIniFile) then begin    CreateDir(sIniFile);  end;  sIniFile := g_sGameDirectory + 'Mir200\' + 'ConLog\';  if not DirectoryExists(sIniFile) then begin    CreateDir(sIniFile);  end;  sIniFile := g_sGameDirectory + 'Mir200\' + 'Castle\';  if not DirectoryExists(sIniFile) then begin    CreateDir(sIniFile);  end;  sIniFile := g_sGameDirectory + 'Mir200\' + 'Envir\';  if not DirectoryExists(sIniFile) then begin    CreateDir(sIniFile);  end;  sIniFile := g_sGameDirectory + 'Mir200\' + 'Map\';  if not DirectoryExists(sIniFile) then begin    CreateDir(sIniFile);  end;  sIniFile := g_sGameDirectory + 'Mir200\' + 'Notice\';  if not DirectoryExists(sIniFile) then begin    CreateDir(sIniFile);  end;  sIniFile := g_sGameDirectory + 'Mir200\' + 'Log\';  if not DirectoryExists(sIniFile) then begin    CreateDir(sIniFile);  end;  sIniFile := g_sGameDirectory + 'Mir200\' + 'EMail\';  if not DirectoryExists(sIniFile) then begin    CreateDir(sIniFile);  end;

很明显,重复的比较多,INI文件读写的时候数据类型不同,写代码时也太慢了,找了一个通用读写INI文件的函数,只取了自己需要的部分,并稍作修改,根据传入的参数类型自动判断数据类型,听说用variant变量会占资源,先用用看:

//读取INIfunction ReadIniValue(const FileName, Section, Name: string; DefaultValue: Variant): Variant;begin  with TIniFile.Create(FileName) do  try    if VarType(DefaultValue)=varStrArg then      Result := ReadString(Section, Name, DefaultValue)    else if VarType(DefaultValue)=varInteger then      Result := ReadInteger(Section, Name, DefaultValue)    else if VarType(DefaultValue)=varDouble then      Result := ReadFloat(Section, Name, DefaultValue)    else if VarType(DefaultValue)=varBoolean then      Result := ReadBool(Section, Name, DefaultValue);  finally    Free;  end;end;//写入INIprocedure WriteIniValue(const FileName, Section, Name: string;Value: Variant);begin  with TIniFile.Create(FileName) do  try    if VarType(Value)=varStrArg then      WriteString(Section, Name, VarToStr(Value))    else if VarType(Value)=varInteger then      WriteInteger(Section, Name, Value)    else if VarType(Value)=varDouble then      WriteFloat(Section, Name, Value)    else if VarType(Value)=varBoolean then      WriteBool(Section, Name, Value);  finally    Free;  end;end;//检测目录不存在就创建procedure IfNoDirThenCreate(const DirPath:string);begin  if not DirectoryExists(DirPath) then CreateDir(DirPath);end;
对这些基本不变的东西,占用的代码空间太大了,原先是准备用静态数组声明,然后用FOR循环一块处理,后来觉得那样还是不直观,还是准备整理一下写到数据库或者dll文件里边,里边用到的函数尽量都缩小到50行以内,对自己也是个锻炼.

转载于:https://www.cnblogs.com/iicc/p/5043396.html

你可能感兴趣的文章
我的友情链接
查看>>
使用spring的自身的listener进行web的配置
查看>>
linux学习之“VI”与“VIM”
查看>>
linux下无线网卡驱动安装
查看>>
oracle recyclebin与flashback drop
查看>>
我的友情链接
查看>>
svmlight使用说明
查看>>
LVM
查看>>
学习之shell脚本
查看>>
Andorid Launcher程序代码分析
查看>>
Swing 和AWT之间的关系
查看>>
Mysql设置自增长主键的初始值
查看>>
Android计时器正确应用方式解析
查看>>
性能及监控
查看>>
linux系统CPU、内存、硬盘、网络、lnmp服务整体监控邮件报警
查看>>
我的友情链接
查看>>
个人总结问卷调查,头脑风暴,焦点小组的区别
查看>>
【转】不懂得使用工具的测试不是好测试
查看>>
JMeter基础之-使用技巧
查看>>
获取post传输参数
查看>>