Rama’s Get All Files and Directories Functions for You
**Rama’s Functions For You
Get All Files
Get All Directories**
**Optional Search String or File Extension Filters!
Platform-Agnostic
**
Copy Paste Code For You!
Stick my code below in a C++ function library of yours somewheres!
**Background**
I wrote my own custom code from scratch to get both files and directories during the UE4 Beta program.
I've actually done a lot of low level file-access code in UE4!
**The very first C++ code of mine that Epic accepted into the Engine** was a platform-agnostic file operations function!
[Pull Request #27, IPlatformFile::CopyDirectoryTree](https://github.com/EpicGames/UnrealEngine/pull/27/files)!
( can be found in **GenericPlatformFile.cpp** )
Get All Files, Get All Directories
Both of my functions have option to search recursively all subdirectories
And also an optional file extension filter!
I use this code all the time.
I use a functor and a directory iterator
You can use this code to access any directory on your hard-drive
My method is platform-agnostic, using UE4 functions in IPlatformFile.
**Rama's Copyright Notice**
Please simply include the fact that I am the author of this code if you choose to use it in your code base!
Functor
template <class FunctorType>
class PlatformFileFunctor : public IPlatformFile::FDirectoryVisitor //GenericPlatformFile.h
{
public:
virtual bool Visit(const TCHAR* FilenameOrDirectory, bool bIsDirectory) override
{
return Functor(FilenameOrDirectory, bIsDirectory);
}
PlatformFileFunctor(FunctorType&& FunctorInstance)
: Functor(MoveTemp(FunctorInstance))
{
}
private:
FunctorType Functor;
};
template <class Functor>
PlatformFileFunctor<Functor> MakeDirectoryVisitor(Functor&& FunctorInstance)
{
return PlatformFileFunctor<Functor>(MoveTemp(FunctorInstance));
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Victory Get All Files
// Optional File Extension Filter!!! by Rama
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
static FORCEINLINE bool GetFiles(const FString& FullPathOfBaseDir, TArray<FString>& FilenamesOut, bool Recursive=false, const FString& FilterByExtension = "")
{
//Format File Extension, remove the "." if present
const FString FileExt = FilterByExtension.Replace(TEXT("."),TEXT("")).ToLower();
FString Str;
auto FilenamesVisitor = MakeDirectoryVisitor(
&](const TCHAR* FilenameOrDirectory, bool bIsDirectory)
{
//Files
if ( ! bIsDirectory)
{
//Filter by Extension
if(FileExt != "")
{
Str = FPaths::GetCleanFilename(FilenameOrDirectory);
//Filter by Extension
if(FPaths::GetExtension(Str).ToLower() == FileExt)
{
if(Recursive)
{
FilenamesOut.Push(FilenameOrDirectory); //need whole path for recursive
}
else
{
FilenamesOut.Push(Str);
}
}
}
//Include All Filenames!
else
{
//Just the Directory
Str = FPaths::GetCleanFilename(FilenameOrDirectory);
if(Recursive)
{
FilenamesOut.Push(FilenameOrDirectory); //need whole path for recursive
}
else
{
FilenamesOut.Push(Str);
}
}
}
return true;
}
);
if(Recursive)
{
return FPlatformFileManager::Get().GetPlatformFile().IterateDirectoryRecursively(*FullPathOfBaseDir, FilenamesVisitor);
}
else
{
return FPlatformFileManager::Get().GetPlatformFile().IterateDirectory(*FullPathOfBaseDir, FilenamesVisitor);
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Victory Get Directories
// Optional Search SubString!!! by Rama
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//Get Directories
static FORCEINLINE bool GetDirectories(const FString& FullPathOfBaseDir, TArray<FString>& DirsOut, bool Recursive=false, const FString& ContainsStr="")
{
FString Str;
auto FilenamesVisitor = MakeDirectoryVisitor(
&](const TCHAR* FilenameOrDirectory, bool bIsDirectory)
{
if (bIsDirectory)
{
//Using a Contains Filter?
if(ContainsStr != "")
{
Str = FPaths::GetCleanFilename(FilenameOrDirectory);
//Only if Directory Contains Str
if(Str.Contains(ContainsStr))
{
if(Recursive) DirsOut.Push(FilenameOrDirectory); //need whole path for recursive
else DirsOut.Push(Str);
}
}
//Get ALL Directories!
else
{
//Just the Directory
Str = FPaths::GetCleanFilename(FilenameOrDirectory);
if(Recursive) DirsOut.Push(FilenameOrDirectory); //need whole path for recursive
else DirsOut.Push(Str);
}
}
return true;
}
);
if(Recursive)
{
return FPlatformFileManager::Get().GetPlatformFile().IterateDirectoryRecursively(*FullPathOfBaseDir, FilenamesVisitor);
}
else
{
return FPlatformFileManager::Get().GetPlatformFile().IterateDirectory(*FullPathOfBaseDir, FilenamesVisitor);
}
}
};
**Absolute Paths**
Please note that the paths that you pass in to my above functions must be fully qualified / absolute paths.
You can use my wiki on path functions to get such a path.
**Rama's Wiki on Getting Absolute Paths to Your UE4 Project Files**
https://wiki.unrealengine.com/Packaged_Game_Paths,_Obtain_Directories_Based_on_Executable_Location
Enjoy!
https://www.mediafire.com/convkey/a416/xh2a0w6qocsc9xb6g.jpg
Rama