UE4 读取ini文件 小记

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文件无法读取的问题。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值