Merge pull request #11 from SHADE-DP/SP3-14-FileSystem
File system base Implementation Basic tree structure for file system created Directory traversal with tree building
This commit is contained in:
commit
cc2adcb2ab
|
@ -116,6 +116,7 @@
|
||||||
<ClInclude Include="src\Engine\ECS_Base\System\SHSystem.h" />
|
<ClInclude Include="src\Engine\ECS_Base\System\SHSystem.h" />
|
||||||
<ClInclude Include="src\Engine\ECS_Base\System\SHSystemManager.h" />
|
<ClInclude Include="src\Engine\ECS_Base\System\SHSystemManager.h" />
|
||||||
<ClInclude Include="src\Engine\SHEngine.h" />
|
<ClInclude Include="src\Engine\SHEngine.h" />
|
||||||
|
<ClInclude Include="src\Filesystem\SHFileSystem.h" />
|
||||||
<ClInclude Include="src\Graphics\Buffers\SHVkBuffer.h" />
|
<ClInclude Include="src\Graphics\Buffers\SHVkBuffer.h" />
|
||||||
<ClInclude Include="src\Graphics\Commands\SHCommandPoolResetMode.h" />
|
<ClInclude Include="src\Graphics\Commands\SHCommandPoolResetMode.h" />
|
||||||
<ClInclude Include="src\Graphics\Commands\SHVkCommandBuffer.h" />
|
<ClInclude Include="src\Graphics\Commands\SHVkCommandBuffer.h" />
|
||||||
|
@ -199,6 +200,7 @@
|
||||||
<ClCompile Include="src\Engine\ECS_Base\System\SHEntityManager.cpp" />
|
<ClCompile Include="src\Engine\ECS_Base\System\SHEntityManager.cpp" />
|
||||||
<ClCompile Include="src\Engine\ECS_Base\System\SHSystemManager.cpp" />
|
<ClCompile Include="src\Engine\ECS_Base\System\SHSystemManager.cpp" />
|
||||||
<ClCompile Include="src\Engine\SHEngine.cpp" />
|
<ClCompile Include="src\Engine\SHEngine.cpp" />
|
||||||
|
<ClCompile Include="src\Filesystem\SHFileSystem.cpp" />
|
||||||
<ClCompile Include="src\Graphics\Buffers\SHVkBuffer.cpp" />
|
<ClCompile Include="src\Graphics\Buffers\SHVkBuffer.cpp" />
|
||||||
<ClCompile Include="src\Graphics\Commands\SHVkCommandBuffer.cpp" />
|
<ClCompile Include="src\Graphics\Commands\SHVkCommandBuffer.cpp" />
|
||||||
<ClCompile Include="src\Graphics\Commands\SHVkCommandPool.cpp" />
|
<ClCompile Include="src\Graphics\Commands\SHVkCommandPool.cpp" />
|
||||||
|
|
|
@ -19,6 +19,9 @@
|
||||||
<Filter Include="Engine\ECS_Base\System">
|
<Filter Include="Engine\ECS_Base\System">
|
||||||
<UniqueIdentifier>{B3E3FAFD-9FDD-2350-884A-BA6074E389BC}</UniqueIdentifier>
|
<UniqueIdentifier>{B3E3FAFD-9FDD-2350-884A-BA6074E389BC}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter Include="Filesystem">
|
||||||
|
<UniqueIdentifier>{8A8E2B37-7646-6D84-DF4D-46E0CB240875}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
<Filter Include="Graphics">
|
<Filter Include="Graphics">
|
||||||
<UniqueIdentifier>{1653CE33-0220-293F-2B39-17E717655ECD}</UniqueIdentifier>
|
<UniqueIdentifier>{1653CE33-0220-293F-2B39-17E717655ECD}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
@ -156,6 +159,9 @@
|
||||||
<ClInclude Include="src\Engine\SHEngine.h">
|
<ClInclude Include="src\Engine\SHEngine.h">
|
||||||
<Filter>Engine</Filter>
|
<Filter>Engine</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="src\Filesystem\SHFileSystem.h">
|
||||||
|
<Filter>Filesystem</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="src\Graphics\Buffers\SHVkBuffer.h">
|
<ClInclude Include="src\Graphics\Buffers\SHVkBuffer.h">
|
||||||
<Filter>Graphics\Buffers</Filter>
|
<Filter>Graphics\Buffers</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
@ -407,6 +413,9 @@
|
||||||
<ClCompile Include="src\Engine\SHEngine.cpp">
|
<ClCompile Include="src\Engine\SHEngine.cpp">
|
||||||
<Filter>Engine</Filter>
|
<Filter>Engine</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="src\Filesystem\SHFileSystem.cpp">
|
||||||
|
<Filter>Filesystem</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="src\Graphics\Buffers\SHVkBuffer.cpp">
|
<ClCompile Include="src\Graphics\Buffers\SHVkBuffer.cpp">
|
||||||
<Filter>Graphics\Buffers</Filter>
|
<Filter>Graphics\Buffers</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|
|
@ -0,0 +1,135 @@
|
||||||
|
#include "SHpch.h"
|
||||||
|
#include "SHFileSystem.h"
|
||||||
|
#include "fileapi.h"
|
||||||
|
#include <filesystem>
|
||||||
|
#include <cassert>
|
||||||
|
#include <queue>
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
char const FOLDER_MAX_COUNT {15};
|
||||||
|
|
||||||
|
std::unordered_map<FolderLocation, std::unique_ptr<SHFolder>> SHFileSystem::folders;
|
||||||
|
FolderPointer SHFileSystem::root {nullptr};
|
||||||
|
|
||||||
|
SHFolder::SHFolder(FolderHandle id, FolderName name)
|
||||||
|
:id{ id }, name{ name }, subFolders(0), folded{ false }, path{""}
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
FolderLocation SHFileSystem::CreateNewFolderHere(FolderName name, FolderLocation here) noexcept
|
||||||
|
{
|
||||||
|
if (here == 0)
|
||||||
|
{
|
||||||
|
if (!folders.contains(0))
|
||||||
|
{
|
||||||
|
folders[0] = std::make_unique<SHFolder>(0, "root");
|
||||||
|
}
|
||||||
|
|
||||||
|
auto const count = static_cast<FolderCounter>(folders[here]->subFolders.size());
|
||||||
|
|
||||||
|
assert(count < FOLDER_MAX_COUNT, "Max subfolders reached\n");
|
||||||
|
|
||||||
|
auto const location = static_cast<FolderLocation>(count);
|
||||||
|
|
||||||
|
CreateFolder(folders[0]->path, here, location, name);
|
||||||
|
|
||||||
|
return location;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(folders.contains(here), "Folder creation location does not exist/invalid\n");
|
||||||
|
|
||||||
|
auto const count = static_cast<FolderCounter>(folders[here]->subFolders.size());
|
||||||
|
|
||||||
|
FolderHandle location = here;
|
||||||
|
location <<= FOLDER_BIT_ALLOCATE;
|
||||||
|
location |= count;
|
||||||
|
|
||||||
|
assert(count < FOLDER_MAX_COUNT, "Max subfolders reached\n");
|
||||||
|
CreateFolder(folders[0]->path, here, location, name);
|
||||||
|
|
||||||
|
return location;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SHFileSystem::DeleteFolder(FolderPointer location) noexcept
|
||||||
|
{
|
||||||
|
assert(folders.contains(location->id), "Delete target does not exist/invalid.\n");
|
||||||
|
|
||||||
|
for (auto const& subFolder : folders[location->id]->subFolders)
|
||||||
|
{
|
||||||
|
DeleteFolder(subFolder);
|
||||||
|
}
|
||||||
|
|
||||||
|
RemoveDirectoryA(folders[location->id]->path.c_str());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHFileSystem::StartupFillDirectories(FolderPath path) noexcept
|
||||||
|
{
|
||||||
|
std::queue<FolderPointer> folderQueue;
|
||||||
|
|
||||||
|
folderQueue.push(RegisterFolder(path, 0, 0, "Root"));
|
||||||
|
|
||||||
|
while (!folderQueue.empty())
|
||||||
|
{
|
||||||
|
auto folder = folderQueue.front();
|
||||||
|
folderQueue.pop();
|
||||||
|
FolderCounter count = 0;
|
||||||
|
|
||||||
|
for (auto const& dirEntry : std::filesystem::directory_iterator(folder->path))
|
||||||
|
{
|
||||||
|
if (!dirEntry.is_directory())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
FolderLocation location = folder->id;
|
||||||
|
location <<= FOLDER_BIT_ALLOCATE;
|
||||||
|
location |= ++count;
|
||||||
|
|
||||||
|
std::string name = dirEntry.path().string();
|
||||||
|
name = name.substr(name.find_last_of('/') + 1, name.length() - name.find_last_of('/'));
|
||||||
|
|
||||||
|
FolderPointer newFolder{ RegisterFolder(
|
||||||
|
dirEntry.path().string(),
|
||||||
|
folder->id,
|
||||||
|
location,
|
||||||
|
name)
|
||||||
|
};
|
||||||
|
|
||||||
|
folderQueue.push(newFolder);
|
||||||
|
folder->subFolders.push_back(newFolder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FolderPointer SHFileSystem::CreateFolder(FolderPath path, FolderLocation parent, FolderHandle location, FolderName name) noexcept
|
||||||
|
{
|
||||||
|
assert(
|
||||||
|
CreateDirectoryA(path.c_str(), nullptr),
|
||||||
|
"Failed to create folder\n"
|
||||||
|
);
|
||||||
|
|
||||||
|
folders[location] = std::make_unique<SHFolder>(location, name);
|
||||||
|
folders[location]->path = path;
|
||||||
|
folders[parent]->subFolders.push_back(folders[location].get());
|
||||||
|
|
||||||
|
return FolderMakeHelper(path, parent, location, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
FolderPointer SHFileSystem::RegisterFolder(FolderPath path, FolderLocation parent, FolderHandle location,
|
||||||
|
FolderName name) noexcept
|
||||||
|
{
|
||||||
|
return FolderMakeHelper(path, parent, location, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
FolderPointer SHFileSystem::FolderMakeHelper(FolderPath path, FolderLocation parent, FolderHandle location,
|
||||||
|
FolderName name) noexcept
|
||||||
|
{
|
||||||
|
folders[location] = std::make_unique<SHFolder>(location, name);
|
||||||
|
folders[location]->path = path;
|
||||||
|
folders[parent]->subFolders.push_back(folders[location].get());
|
||||||
|
|
||||||
|
return folders[location].get();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <memory>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
class SHFolder;
|
||||||
|
|
||||||
|
typedef unsigned char FolderCounter;
|
||||||
|
typedef unsigned char FileCounter;
|
||||||
|
typedef uint64_t FolderLocation;
|
||||||
|
typedef uint64_t FolderHandle;
|
||||||
|
typedef std::string FolderName;
|
||||||
|
typedef std::string FolderPath;
|
||||||
|
typedef SHFolder* FolderPointer;
|
||||||
|
|
||||||
|
constexpr char FOLDER_BIT_ALLOCATE{ 4 };
|
||||||
|
constexpr char FOLDER_MAX_DEPTH{ 16 };
|
||||||
|
|
||||||
|
class SHFolder
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SHFolder(FolderHandle id, FolderName name);
|
||||||
|
|
||||||
|
FolderHandle id;
|
||||||
|
FolderName name;
|
||||||
|
std::vector<FolderPointer> subFolders;
|
||||||
|
|
||||||
|
bool folded;
|
||||||
|
|
||||||
|
private:
|
||||||
|
FolderPath path;
|
||||||
|
friend class SHFileSystem;
|
||||||
|
};
|
||||||
|
|
||||||
|
class SHFileSystem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static FolderLocation CreateNewFolderHere(FolderName name, FolderLocation here = 0) noexcept;
|
||||||
|
|
||||||
|
static bool DeleteFolder(FolderPointer location) noexcept;
|
||||||
|
|
||||||
|
static void StartupFillDirectories(FolderPath path) noexcept;
|
||||||
|
|
||||||
|
private:
|
||||||
|
static FolderPointer root;
|
||||||
|
|
||||||
|
static std::unordered_map<FolderLocation, std::unique_ptr<SHFolder>> folders;
|
||||||
|
|
||||||
|
static FolderPointer CreateFolder(FolderPath path, FolderLocation parent, FolderHandle location, FolderName name) noexcept;
|
||||||
|
static FolderPointer RegisterFolder(FolderPath path, FolderLocation parent, FolderHandle location, FolderName name) noexcept;
|
||||||
|
static FolderPointer FolderMakeHelper(FolderPath path, FolderLocation parent, FolderHandle location, FolderName name) noexcept;
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in New Issue