一直在研究虚幻的插件,期间碰到许多诸如文件操作,路径操作等问题,总结记录一下。
环境:UE4版本4.19.2+Win10+VS2017。
文件操作类(一):IPlatformFile
//实例化IPlatformFile对象
IPlatformFile& fileManager = FPlatformFileManager::Get().GetPlatformFile();
//判断文件是否存在
fileManager.FileExists(const TCHAR* Filename);
//删除文件,执行了删除操作返回true,只读文件无法执行删除
fileManager.DeleteFile(const TCHAR* Filename);
//拷贝文件,选择参数为拷贝方式
fileManager.CopyFile(const TCHAR* To, const TCHAR* From, EPlatformFileRead ReadFlags = EPlatformFileRead::None,
EPlatformFileWrite WriteFlags = EPlatformFileWrite::None);
//递归创建一个文件夹
fileManager.CreateDirectoryTree(const TCHAR* Directory);
//递归删除一个文件夹,包括包含的文件
fileManager.DeleteDirectoryRecursively(const TCHAR* Directory);
//将目标文件夹包含子文件夹下所有的文件以字符串数组的形式赋值给FoundFiles,可以附带文件扩展名过滤,
fileManager.FindFilesRecursively(TArray& FoundFiles, const TCHAR* Directory, const TCHAR* FileExtension);
详见定义位置:Runtime/Core/Public/GenericPlatform/GenericPlatformFile.h
Runtime/Core/Public/HAL/PlatformFilemanager.h
文件操作类(二):FFileHelper
其实是封装好的线程安全的工具类,不过相对的功能不是很全,推荐读写文件时使用,由于方法较少,这里以写入文件及加载文件举栗:
//覆写模式写入文件内容
FFileHelper::SaveStringToFile(
const FString& Content,
const TCHAR* Filename,
EEncodingOptions EncodingOptions = EEncodingOptions::AutoDetect,
IFileManager* FileManager = &IFileManager::Get(),
uint32 WriteFlags = 0 );
其中,覆写模式只需要提供前两个参数就可以了,Content为写入内容,而后三种在自定义模式时需要全部提供,例如:
//换行并以追加模式写入文件内容
FFileHelper::SaveStringToFile("\r\n"+Content, *Filename,
FFileHelper::EEncodingOptions::AutoDetect, &IFileManager::Get(), EFileWrite::FILEWRITE_Append);
其中,EEncodingOptions 为编码格式的枚举类型,定义在 FileHelper.h 中,分别有以下五种:
倒数第二个参数为获取实例化的文件操作对象,
EFileWirte为写入模式的枚举类型,定义在 FileManager.h 中,分别有以下六种:
需要注意的是,在C++中"\n"符号指光标移到下一行的当前位置,"\r"指光标移到行首,需结合使用。
//加载文件内容为字符串,赋值给参数Result,最后的可选参数是校验标识,一般用不到
FFileHelper::LoadFileToString( FString& Result, const TCHAR* Filename, EHashOptions VerifyFlags = EHashOptions::None );
详见定义位置:Runtime/Core/Public/Misc/FileHelper.h
路径操作类:FPaths
FPaths::RootDir();//返回根目录路径
FPaths::ProjectDir();//返回项目所在文件夹路径,注意:4.18版本为 GameDir();已经无法在新版中使用
FPaths::ProjectConfigDir();//返回项目配置文件夹路径
FPaths::RemoveDuplicateSlashes(FString& InPath);//删除InPath中重复的斜杠
FPaths::ConvertRelativePathToFull(const FString& InPath);//将相对路径转换为绝对路径并返回
FPaths::ValidatePath(const FString& InPath, FText* OutReason = nullptr);//校验路径返回是否正确,可选参数用于替换路径中的失效字符
//分割路径,根据给定分隔符 ExtensionPart 将InPath 分割为两部分,分别赋值给参数PathPart和FileNamePart,可以理解为左右两部分
FPaths::Split( const FString& InPath, FString& PathPart, FString& FilenamePart, FString& ExtensionPart );
//将输入的多个路径拼接成一个路径,可以拼接字符串,类似FString中的字符串拼接
FPaths::Combine(PathTypes&&... InPaths)
详见定义位置:Paths.h