October3d55/Matain/SocketIOClient/Source/CoreUtility/Private/CUFileSubsystem.cpp

142 lines
3.4 KiB
C++

#include "CUFileSubsystem.h"
#include "HAL/PlatformFileManager.h"
#include "Misc/FileHelper.h"
#include "Misc/Paths.h"
#if PLATFORM_ANDROID
#include "Android/AndroidPlatformMisc.h"
#endif
void UCUFileSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
}
void UCUFileSubsystem::Deinitialize()
{
}
FString UCUFileSubsystem::ProjectContentsDirectory()
{
return FPaths::ProjectContentDir();
}
FString UCUFileSubsystem::ProjectDirectory()
{
return FPaths::ProjectDir();
}
FString UCUFileSubsystem::ProjectSavedDirectory()
{
return FPaths::ProjectSavedDir();
}
FString UCUFileSubsystem::ExternalSaveDirectory()
{
#if PLATFORM_ANDROID
return FString(FAndroidMisc::GamePersistentDownloadDir());
#else
return FPaths::ProjectSavedDir();
#endif
}
void UCUFileSubsystem::SplitFullPath(const FString& InFullPath, FString& OutDirectory, FString& OutFileName)
{
bool bDidSplit = InFullPath.Split(TEXT("/"), &OutDirectory, &OutFileName, ESearchCase::CaseSensitive, ESearchDir::FromEnd);
if (!bDidSplit)
{
//search by backslash
InFullPath.Split(TEXT("\\\\"), &OutDirectory, &OutFileName, ESearchCase::CaseSensitive, ESearchDir::FromEnd);
}
}
void UCUFileSubsystem::ProjectRelativePath(const FString& InFullPath, FString& OutProjectRelativePath)
{
const FString PathToProject = ProjectDirectory();
FString Before, After;
InFullPath.Split(PathToProject, &Before, &After);
OutProjectRelativePath = After;
}
bool UCUFileSubsystem::SaveBytesToFile(const TArray<uint8>& Bytes, const FString& Directory, const FString& FileName, bool bLogSave)
{
//bool AllowOverwriting = false;
IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile();
if (PlatformFile.CreateDirectoryTree(*Directory))
{
FString AbsoluteFilePath;
// Get absolute file path
if (Directory.EndsWith(TEXT("/")))
{
AbsoluteFilePath = FPaths::ConvertRelativePathToFull(Directory + FileName);
}
else
{
AbsoluteFilePath = FPaths::ConvertRelativePathToFull(Directory + "/" + FileName);
}
// Allow overwriting or file doesn't already exist
bool bSaveSuccesful = FFileHelper::SaveArrayToFile(Bytes, *AbsoluteFilePath);
if (bLogSave)
{
if (bSaveSuccesful)
{
UE_LOG(LogTemp, Log, TEXT("Saved: %s with %d bytes"), *AbsoluteFilePath, Bytes.Num());
}
else
{
UE_LOG(LogTemp, Log, TEXT("Failed to save: %s"), *AbsoluteFilePath);
}
}
return bSaveSuccesful;
}
return false;
}
bool UCUFileSubsystem::SaveBytesToPath(const TArray<uint8>& Bytes, const FString& Path, bool bLogSave /*= false*/)
{
//we use the split file overload due to some potential directory automation checks
FString Directory, FileName;
SplitFullPath(Path, Directory, FileName);
return SaveBytesToFile(Bytes, Directory, FileName, bLogSave);
}
bool UCUFileSubsystem::ReadBytesFromFile(const FString& Directory, const FString& FileName, TArray<uint8>& OutBytes)
{
// Get absolute file path
const FString AbsoluteFilePath = Directory + "/" + FileName;
return ReadBytesFromPath(AbsoluteFilePath, OutBytes);
}
bool UCUFileSubsystem::ReadBytesFromPath(const FString& Path, TArray<uint8>& OutBytes)
{
return FFileHelper::LoadFileToArray(OutBytes, *Path);
}
bool UCUFileSubsystem::DeleteFileAtPath(const FString& Path)
{
if (!Path.IsEmpty())
{
if (FPaths::ValidatePath(Path) && FPaths::FileExists(Path))
{
IFileManager& FileManager = IFileManager::Get();
FileManager.Delete(*Path);
return true;
}
}
return false;
}