问题描述:在开发过程中发现一个很费解的现象,同一段代码在两台电脑上有截然不同的表现。在我的电脑上,在UE5编辑器运行时,修改配置文件,读取时读取不到最新修改的数据,但是在同事的电脑上重复该操作却可以读取到最新的数据。
下面是读取配置文件的C++代码
FString ULoadProjectINIBPLibrary::GetIniConfig(const FString Filename, const FString type, const FString key)
{
//初始化
FString Value = "";
if (!GConfig) return Value;
FString path = FPaths::ProjectDir() +Filename;
//刷新
GConfig->Flush(true,path);
//检查路径
bool isExists= FFileManagerGeneric::Get().FileExists(*path);
if(!isExists)
{
//路径文件不存在
GEngine->AddOnScreenDebugMessage(-1,20.0,FColor::Red,TEXT("未找到配置文件"+Filename));
return Value;
}
FText valueText ;
GConfig->GetText(*type, *key, valueText, path);
FString outstring = valueText.ToString();
return outstring;
}
很费解的是,代码中也使用了Flush,将其从缓存中清空。到底是哪出现了问题?
接着通过检查output,发现了LogConfig输出Warning信息:Warning: GConfig::Find attempting to access config with non-normalized path ../../../../../../UEProject/xxxx/xxxxx/Game.ini. Please use FConfigCacheIni::NormalizeConfigIniPath before accessing INI files through ConfigCache.
猜想:在我电脑上的该文件路径并不是标准化路径,所以要调NormalizeConfigIniPath()将其转为标准化路径,再对其使用Flush刷新。
将上述代码 path 变量修改如下
FString path = GConfig->NormalizeConfigIniPath(FPaths::ProjectDir() + Filename);
再次测试,发现已经可以读取到实时更新的INI文件了。
总结:在UE5开发过程中,读取ini配置文件的重要两步
第一步:将文件路径转换为标准化路径
GConfig->NormalizeConfigIniPath(FString Path);
第二步:刷新
GConfig->Flush(bool bRemoveFromCache, FString path)