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

继承UBlueprintFunctionLibrary

.h

	//查找文件
	UFUNCTION(BlueprintCallable, Category = "ExtendedContent|File")
		static TArray<FString> FindFiles(FString Path, FString Filter, bool InFiles, bool InDirectory);//3true返回文件,4true返回文件夹
	/**移动文件位置*/
	UFUNCTION(BlueprintCallable, Category = "ExtendedContent|file")
		static bool MoveFileTo(FString To, FString From);
	/**删除一个文件*/
	UFUNCTION(BlueprintCallable, Category = "ExtendedContent|file")
		static bool DeleteFile(FString FilePath);
.cpp
TArray<FString> ULoadTexture::FindFiles(FString Path, FString Filter, bool InFiles, bool InDirectory)
{
	TArray<FString> FilePathList;
	//清空数组
	FilePathList.Empty();
	//查找文件并将结果赋给FileList
	FFileManagerGeneric::Get().FindFilesRecursive(FilePathList, *Path, *Filter, InFiles, InDirectory);
	//返回结果
	return FilePathList;
}
bool ACPassword::MoveFileTo(FString To, FString From)
{
	return IFileManager::Get().Move(*To, *From);
}
bool ACPassword::DeleteFile(FString FilePath)
{
	return IFileManager::Get().Delete(*FilePath);
}

 

复制文件

FPlatformFileManager::Get().GetPlatformFile().CopyFile(*To, *From);
IFileManager::Get().Copy(*To, *From);

创建文件夹

bool AMyActor::CreateMyDirectory(const FString& TestDir)
{
	// Every function call, unless the function is inline, adds a small
	// overhead which we can avoid by creating a local variable like so.
	// But beware of making every function inline!
	IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile();

	// Directory Exists?
	if (!PlatformFile.DirectoryExists(*TestDir))
	{
		PlatformFile.CreateDirectory(*TestDir);
		return true;
	}
	else
	{
		GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Yellow, TEXT("File存在!"));
		return false;
	}
}

删除文件夹

IPlatformFile &PlatformFile = FPlatformFileManager::Get().GetPlatformFile();
PlatFileModule.DeleteDirectoryRecursively(*(CurFilePath));

获取文件大小

FString AMyActor::GetMyFileSize(FString MyFilePath)
{
	if (!FPlatformFileManager::Get().GetPlatformFile().FileExists(*MyFilePath))
	{
		GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Yellow, TEXT("Could Not Find File!"));
		return "0";
	}
	const int64 FileSize = FPlatformFileManager::Get().GetPlatformFile().FileSize(*MyFilePath);

	FString Message = FString::Printf(TEXT("File size is: %d"), FileSize);
	return Message;
}

写入读取TXT

.h

	UFUNCTION(BlueprintCallable, Category = "save")
		static bool FileSaveString(FString SaveTextB, FString FileNameB);
	UFUNCTION(BlueprintCallable, Category = "save")
		static bool FileLoadString(FString FileNameA, FString& SaveTextA );

.cpp

bool AMyActor::FileSaveString(FString SaveTextB, FString FileNameB)
{
	return FFileHelper::SaveStringToFile(SaveTextB, *(FPaths::GameDir() + FileNameB));
}

bool AMyActor::FileLoadString(FString FileNameA, FString& SaveTextA)
{
	return FFileHelper::LoadFileToString(SaveTextA, *(FPaths::GameDir() + FileNameA));
}

查找指定目录下的所有文件夹

TArray<FString> UToolLibrary::GetAllDirectorysInPath(const FString& Path)
{
	TArray<FString> FoundFolders;
	if (FPaths::DirectoryExists(Path))
	{
		FFileManagerGeneric::Get().FindFilesRecursive(FoundFolders, *Path, TEXT("*"), false, true, true);		
	}
	return FoundFolders;

例:查找指定目录下的所有文件

// 遍历文件夹下指定类型文件
// 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);
	}

}//参考:http://blog.csdn.net/xi_niuniu/article/details/54428027


//如果需要递归查找所有文件使用
IPlatformFile& fileManager = FPlatformFileManager::Get().GetPlatformFile();
	fileManager.FindFilesRecursively(FindedFiles, *SearchedFiles, *Extension);
//"path","","png"
TArray<FString> ALoadPackageMapAsyncActor::GetAllFilesInDirector(const FString directory, const FString onlyFilesStartingWith, const FString extension)
{
	FString Directory1 = FPaths::GameDir() + directory;
	TArray<FString> directoriesToSkip;
	IPlatformFile &PlatformFile = FPlatformFileManager::Get().GetPlatformFile();
	FLocalTimestampDirectoryVisitor Visitor(PlatformFile, directoriesToSkip, directoriesToSkip, false);
	PlatformFile.IterateDirectory(*Directory1, Visitor);
	TArray<FString> files;
	for (TMap<FString, FDateTime>::TIterator TimestampIt(Visitor.FileTimes); TimestampIt; ++TimestampIt)
	{
		const FString filePath = TimestampIt.Key();
		const FString fileName = FPaths::GetCleanFilename(filePath);
		const FString fileBaseName = FPaths::GetBaseFilename(filePath);
		bool shouldAddFile = true;

		if (!onlyFilesStartingWith.IsEmpty())
		{
			const FString left = fileName.Left(onlyFilesStartingWith.Len());
			if (!(fileName.Left(onlyFilesStartingWith.Len()).Equals(onlyFilesStartingWith)))
				shouldAddFile = false;
		}

		if (!extension.IsEmpty())
			if (!(FPaths::GetExtension(fileName, false).Equals(extension, ESearchCase::IgnoreCase)))
				shouldAddFile = false;

		if (shouldAddFile)
			files.Add(filePath);

	}
	if (files.Num() == 0)
	{
		GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Yellow, TEXT("no array"));
	}
	return files;
}//参考:http://blog.csdn.net/u012803165/article/details/79034176
TArray<FString> ULoaderBPFunctionLibrary::GetAllFilesInDirectory(const FString directory, const bool fullPath, const bool withoutExtention, const FString onlyFilesStartingWith, const FString onlyFilesWithExtension)
{
	// Get all files in directory
	TArray<FString> directoriesToSkip;
	IPlatformFile &PlatformFile = FPlatformFileManager::Get().GetPlatformFile();
	FLocalTimestampDirectoryVisitor Visitor(PlatformFile, directoriesToSkip, directoriesToSkip, false);
	PlatformFile.IterateDirectory(*directory, Visitor);
	TArray<FString> files;

	for (TMap<FString, FDateTime>::TIterator TimestampIt(Visitor.FileTimes); TimestampIt; ++TimestampIt)
	{
		const FString filePath = TimestampIt.Key();
		const FString fileName = FPaths::GetCleanFilename(filePath);
		bool shouldAddFile = true;

		if (!onlyFilesStartingWith.IsEmpty())
		{
			const FString left = fileName.Left(onlyFilesStartingWith.Len());

			if (!(fileName.Left(onlyFilesStartingWith.Len()).Equals(onlyFilesStartingWith)))
				shouldAddFile = false;
		}

		if (!onlyFilesWithExtension.IsEmpty())
		{
			if (!(FPaths::GetExtension(fileName, false).Equals(onlyFilesWithExtension, ESearchCase::IgnoreCase)))
				shouldAddFile = false;
		}


		if (shouldAddFile)
		{
			if (withoutExtention)
				files.Add(fullPath ? filePath : FPaths::GetBaseFilename(filePath));
			else
				files.Add(fullPath ? filePath : FPaths::GetCleanFilename(filePath));
		}
	}

	return files;
}

查看文件修改时间

FDataTime AMyActor::GetFileModifyDate(FString Path)
{
	IFileManager& m_FilelManager = IFileManager::Get();
	return m_FilelManager.GetTimeStamp(*Path);
}

复制文件夹

#define LOCTEXT_NAMESPACE "UECppTest"
void AMyActor::CopyFileTo(FString FromFolder, FString DestinationFolder)
{
	TArray<FString> FindedFiles;

	IPlatformFile& fileManager = FPlatformFileManager::Get().GetPlatformFile();
	fileManager.FindFilesRecursively(FindedFiles, *FromFolder, nullptr);

	bool bUserCanceled = false;
	EAppReturnType::Type LastResponse = EAppReturnType::Yes;
	TArray<FString> SuccessfullyCopiedFiles;
	TArray<FString> SuccessfullyCopiedPackages;
	FString CopyErrors;

//进度条
//FScopedSlowTask SlowTask(2, LOCTEXT("MigratePackages_CopyingFiles", "Copying Files..."));
	//SlowTask.MakeDialog();
	//SlowTask.EnterProgressFrame();
	//{
	//	FScopedSlowTask LoopProgress(FindedFiles.Num());
	

	//所有文件
	for (auto PackageNameIt = FindedFiles.CreateConstIterator(); PackageNameIt; ++PackageNameIt)
	{
        //LoopProgress.EnterProgressFrame();//进度条
		const FString& PackageName = *PackageNameIt;
		const FString RootPath = L"C:\\Users\\Administrator\\Desktop";
		FString SrcFilename = PackageName;
		
			const FString DestFilename = SrcFilename.Replace(*RootPath, *DestinationFolder);

			bool bFileOKToCopy = true;
			if (IFileManager::Get().FileSize(*PackageName) > 0)
			{
				if (IFileManager::Get().FileExists(*DestFilename))
				{
					// The destination file already exists! Ask the user what to do.
					EAppReturnType::Type Response;
					if (LastResponse == EAppReturnType::YesAll || LastResponse == EAppReturnType::NoAll)
					{
						Response = LastResponse;
					}
					else
					{
						const FText Message = FText::Format(LOCTEXT("MigratePackages_AlreadyExists", "An asset already exists at location {0} would you like to overwrite it?"), FText::FromString(DestFilename));
						//FString Message = FString::Printf(TEXT("An asset already exists at location %s would you like to overwrite it?"), DestFilename);
						//FString Message = TEXT("An asset already exists at location %s would you like to overwrite it?"), DestFilename;
						Response = FMessageDialog::Open(EAppMsgType::YesNoYesAllNoAllCancel, (Message));
						if (Response == EAppReturnType::Cancel)
						{
							// The user chose to cancel mid-operation. Break out.
							bUserCanceled = true;
							break;
						}
						LastResponse = Response;
					}

					const bool bWantOverwrite = Response == EAppReturnType::Yes || Response == EAppReturnType::YesAll;
					if (!bWantOverwrite)
					{
						// User chose not to replace the package
						bFileOKToCopy = false;
					}
				}
			}

			if (bFileOKToCopy)
			{
				if (IFileManager::Get().Copy(*DestFilename, *SrcFilename) == COPY_OK)
				{
					SuccessfullyCopiedPackages.Add(PackageName);
					SuccessfullyCopiedFiles.Add(DestFilename);
					//UE_LOG(LogTemp, Warning, TEXT("Failed to copy %s to %s while migrating assets"), *SrcFilename, *DestFilename);
				}
				else
				{
					UE_LOG(LogTemp, Warning, TEXT("Failed to copy %s to %s while migrating assets"), *SrcFilename, *DestFilename);
					CopyErrors += SrcFilename + LINE_TERMINATOR;
				}
			}
	}

//提示信息
    FMessageLog MigrateLog("AssetTools");
	FText LogMessage = FText::FromString(TEXT("Content migration completed successfully!"));
	EMessageSeverity::Type Severity = EMessageSeverity::Info;
	MigrateLog.Notify(LogMessage, Severity, true);
}
#undef LOCTEXT_NAMESPACE

复制文件夹2

return FPlatformFileManager::Get().GetPlatformFile().CopyDirectoryTree(*To, *From, true);

 

 

 

 

 

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值