98 lines
2.1 KiB
C++
98 lines
2.1 KiB
C++
|
/***
|
||
|
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||
|
|
||
|
File: FSRecursion.cpp
|
||
|
Date: 2022-11-06
|
||
|
Author: Reece
|
||
|
***/
|
||
|
#include <Source/RuntimeInternal.hpp>
|
||
|
#include "FS.hpp"
|
||
|
|
||
|
namespace Aurora::IO::FS
|
||
|
{
|
||
|
struct RecursiveDirIterator : IReadDir
|
||
|
{
|
||
|
AuSPtr<IReadDir> pDir;
|
||
|
AuList<AuString> nextLevel;
|
||
|
AuString curPath;
|
||
|
AuString curSubDir;
|
||
|
|
||
|
bool OpenDir(const AuString &str)
|
||
|
{
|
||
|
curPath = str;
|
||
|
pDir = ReadDir(str);
|
||
|
return bool(pDir);
|
||
|
}
|
||
|
|
||
|
bool OpenNext(const AuString &str)
|
||
|
{
|
||
|
curPath = str;
|
||
|
pDir = ReadDir(str);
|
||
|
return bool(pDir);
|
||
|
}
|
||
|
|
||
|
void DoNext()
|
||
|
{
|
||
|
this->pDir.reset();
|
||
|
|
||
|
if (!nextLevel.size())
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
auto a = nextLevel[0];
|
||
|
nextLevel.erase(nextLevel.begin());
|
||
|
pDir = ReadDir(curPath + "/" + a);
|
||
|
curSubDir = a;
|
||
|
}
|
||
|
|
||
|
virtual StatEx *Next() override
|
||
|
{
|
||
|
if (!this->pDir)
|
||
|
{
|
||
|
return {};
|
||
|
}
|
||
|
|
||
|
auto pNext = this->pDir->Next();
|
||
|
while (!pNext)
|
||
|
{
|
||
|
DoNext();
|
||
|
if (!this->pDir)
|
||
|
{
|
||
|
return {};
|
||
|
}
|
||
|
|
||
|
pNext = this->pDir->Next();
|
||
|
}
|
||
|
|
||
|
if (curSubDir.size())
|
||
|
{
|
||
|
pNext->fileName.insert(pNext->fileName.begin(), curSubDir.begin(), curSubDir.end());
|
||
|
}
|
||
|
|
||
|
if (pNext->bExistsDirectory)
|
||
|
{
|
||
|
nextLevel.push_back(pNext->fileName + "/");
|
||
|
}
|
||
|
|
||
|
return pNext;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
AUKN_SYM AuSPtr<IReadDir> ReadDirRecursive(const AuString &string)
|
||
|
{
|
||
|
auto pObj = AuMakeShared<RecursiveDirIterator>();
|
||
|
if (!pObj)
|
||
|
{
|
||
|
SysPushErrorMem();
|
||
|
return {};
|
||
|
}
|
||
|
|
||
|
if (!pObj->OpenDir(string))
|
||
|
{
|
||
|
return {};
|
||
|
}
|
||
|
|
||
|
return pObj;
|
||
|
}
|
||
|
}
|