UE4 读取非config目录的ini配置时的注意事项
当我们把一些自定义的ini文件放在类似content下的目录时,在对它进行读取的时候,会跳转到
获取String的位置,如下
bool FConfigCacheIni::GetString( const TCHAR* Section, const TCHAR* Key, FString& Value, const FString& Filename )
{
FRemoteConfig::Get()->FinishRead(*Filename); // Ensure the remote file has been loaded and processed
FConfigFile* File = Find( Filename, 0 );
if( !File )
{
return false;
}
......
......
return true;
}
然后在FConfigFile* File = Find( Filename, 0 );的位置,会通过文件名获取ConfigFile的指针,如下
FConfigFile* FConfigCacheIni::Find( const FString& Filename, bool CreateIfNotFound )
{
// check for non-filenames
if(Filename.Len() == 0)
{
return nullptr;
}
// Get file.
FConfigFile* Result = TMap<FString,FConfigFile>::Find( Filename );
// this is || filesize so we load up .int files if file IO is allowed
if( !Result && !bAreFileOperationsDisabled && (CreateIfNotFound || DoesConfigFileExistWrapper(*Filename) ) )
{
Result = &Add( Filename, FConfigFile() );
Result->Read( Filename );
UE_LOG(LogConfig, Verbose, TEXT( "GConfig::Find has loaded file: %s" ), *Filename );
}
return Result;
}
问题就在if( !Result && !bAreFileOperationsDisabled && (CreateIfNotFound || DoesConfigFileExistWrapper(*Filename) ) )这一句上,其中bAreFileOperationsDisabled禁止文件操纵的这个变量必须为false,这时候才能进入该if语句,去对该文件的对象进行创建和引用,但是有些时候我们在保存配置文件时候,为了强制写入,会有如下操作:
SaveConfig(CPF_Config, *FileName);
GConfig->EnableFileOperations();
GConfig->Flush(false, FileName);
GConfig->DisableFileOperations();
这里就完美的把文件操作禁止掉了。所有该位置应该修改为
SaveConfig(CPF_Config, *FileName);
if (GConfig->AreFileOperationsDisabled())
{//如果初始不允许文件操作,则先打开,保存后再关掉
GConfig->EnableFileOperations();
GConfig->Flush(false, FileName); //强行存储。
GConfig->DisableFileOperations();
}
else
{
GConfig->Flush(false, FileName);
}
然后在读取自定义的文件之前,先进行一些判定
bool bConfigOperationsDisabled = GConfig->AreFileOperationsDisabled();
if (bConfigOperationsDisabled)
{
GConfig->EnableFileOperations();
}
//文件读取操作
......
//文件读取操作结束
if (bConfigOperationsDisabled)
{
GConfig->DisableFileOperations();
}
这样就完美的解决了在某些异常情况下,自定义ini文件无法读取的问题。