我正在编写一个使用ini文件来存储所有状态代码(错误,成功代码等)的应用程序。这是一个非常简单的版本:
[success]
000=Status code not found.
[error]
000=Error code not found.
001=Username/Password not found.
我使用的CF组件使用以下代码:
component hint="Set of tools to interact with status codes."{
public function init(string codefile) any{
this.codefile = Arguments.codefile;
}
public function getCodeString(string type, string code) string{
var code = getProfileString(Variables.codefile, Arguments.type, Arguments.code);
return code;
}
}
当我调用getProfileString时,我假设发生的事情是Railo打开文件,搜索密钥并返回值。因此,当我的应用程序增长并且我有更多代码时,我希望这个过程会变慢。那么有没有办法可以在我的init方法中打开文件并将其全部读入变量范围,并从那里调用getProfileString?
答案 0 :(得分:3)
如果你想坚持使用.ini方法,你甚至可以在onApplicationStart中解析你的ini文件并将数据推送到@Sergii推荐的XML文件的应用程序范围内。
做类似的事情:
var sections = getProfileSections(variables.codeFile);
var sectionEntries = [];
var indx = 0;
for (key in sections){
sectionEntries = listToArray(sections[key]);
application[key] = {};
for (indx=1; indx <= arraylen(sectionEntries); indx++){
application[key][sectionEntries[indx]] = getProfileString(variables.cfgFile,key,sectionEntries[indx]);
}
}
还没有在Railo上测试过这个,但它至少应该在ColdFusion 9上运行
答案 1 :(得分:1)
因为您使用的是Railo,所以可能是最简单的解决方案:将文件放入RAM文件系统。
因此文件的完整路径看起来像ram:///some/path/to/config.ini
。
显然,您需要先将文件写入RAM,可能是在第一次请求时。
因此,组件的略微修改版本可能看起来像这样:
component hint="Set of tools to interact with status codes."{
public function init(string codefile, string.ramfile) any{
variables.codefile = arguments.codefile;
variables.ramfile = arguments.ramfile;
}
public function getCodeString(string type, string code) string{
if (NOT fileExists(variables.ramfile)) {
fileCopy(variables.codefile, variables.ramfile);
}
return getProfileString(variables.ramfile, arguments.type, arguments.code);
}
}
请注意,我已将this.codefile
更改为variables.codefile
中的init
。
无论如何,我也不确定ini文件是最方便和可维护的解决方案。你需要每次都解析它,对吗?如果您需要文件配置,请使用XML。只需在onApplicationStart
中解析它并将数据推送到应用程序范围。