[UE4]C++操作文件系统


// 遍历文件夹下指定类型文件
// Files 保存遍例到的所有文件
// FilePath 文件夹路径  如 "D:\\MyCodes\\LearnUE4Cpp\\Source\\LearnUE4Cpp\\"
// Extension 扩展名(文件类型) 如 "*.cpp"
void UMyBlueprintFunctionLibrary::ScanDirectory(TArray<FString>& Files, const FString & FilePath, const FString& Extension)
{
    FString SearchedFiles = FilePath + Extension;
    TArray<FString> FindedFiles;
 
    IFileManager::Get().FindFiles(FindedFiles, *SearchedFiles, true, false);
 
    FString SearchFile = "";
 
    for (int i = 0; i < FindedFiles.Num(); i++)
    {
        SearchFile = FilePath + FindedFiles[i];
        Files.Add(SearchFile);
 
        GEngine->AddOnScreenDebugMessage(-1, 100, FColor::Red, SearchFile);
    }
 
}

----------------------------------------------------------------------------------------------------------

UE4C++ 查找文件 移动文件 删除文件

https://blog.csdn.net/u014532636/article/details/71726559

-------------------------------------------------------------------------------------------------------------------

1.遍历文件夹,加载所有uasset

TArray<UObject*> LoadedObjects;


 FString ResourcePath("/Game/GameResource/UI");

 if (EngineUtils::FindOrLoadAssetsByPath(ResourcePath, LoadedObjects, EngineUtils::ATL_Regular))
 {
  for (auto ObjectIter = LoadedObjects.CreateConstIterator(); ObjectIter; ++ObjectIter)
  {
   UUI_BorderAsset* board_asset = Cast<UUI_BorderAsset>(*ObjectIter);
  }
 }

2.遍历文件夹,得到所有文件名,可以是其他的文件比如TXT等

class ItemTableVisitor : public IPlatformFile::FDirectoryVisitor
{

 virtual bool Visit(const TCHAR* FilenameOrDirectory, bool bIsDirectory) override
 {
  if ( !bIsDirectory )
  {
   FString filepath = FString(FilenameOrDirectory);
  }
  return true;
 }

};

void ReadAll()
{
 ItemTableVisitor Visitor;
 FPlatformFileManager::Get().GetPlatformFile().IterateDirectoryRecursively( *(FPaths::GameContentDir() + L"GameData/"), Visitor);
}

读文件:

1.自己二进制方式读取

IPlatformFile& platFormFile = FPlatformFileManager::Get().GetPlatformFile();
IFileHandle *fileHandle = platFormFile.OpenRead(*(FPaths::GameContentDir() + Path));
if (!fileHandle)
{
return nullptr;
}


uint8* readbuffer = new uint8[fileHandle->Size() + 1];
fileHandle->Read(readbuffer, fileHandle->Size());
readbuffer[fileHandle->Size()] = 0;
delete fileHandle;
FString filestring(ANSI_TO_TCHAR((char*)readbuffer));
delete[] readbuffer;

读取一个文件的另一种方式:

FArchive* file = IFileManager::Get().CreateFileWriter(*filepathtosave);

2.读取一个字符串:

FFileHelper::LoadFileToString(filestring, *(FPaths::GameContentDir() + Path));

Engine\Source\Runtime\Core\Public\Misc\CoreMisc.h

FFileHelper也有吧字符串保存到文件的函数。

--------------------------------------------------------------------------------------------------------------------

在UE4里打开外部文件

FPlatformProcess::CreateProc(*FilePath, nullptr, true, false, false, nullptr, 0, nullptr, nullptr);

UE4文件及路径类库使用总结

https://blog.csdn.net/qq_35221523/article/details/80462176

文件操作类(一):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<FString>& 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 中,分别有以下五种:

AutoDetect
ForceAnsi
ForceUnicode
ForceUTF8
ForceUTF8WithoutBOM
倒数第二个参数为获取实例化的文件操作对象,

EFileWirte为写入模式的枚举类型,定义在 FileManager.h 中,分别有以下六种:

FILEWRITE_None
FILEWRITE_NoFail
FILEWRITE_NoReplaceExisting
FILEWRITE_EvenIfReadOnly
FILEWRITE_Append
FILEWRITE_AllowRead
需要注意的是,在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

猜你喜欢

转载自blog.csdn.net/qq173681019/article/details/85775054