diff --git a/SHADE_Engine/SHADE_Engine.vcxproj b/SHADE_Engine/SHADE_Engine.vcxproj
index d89ec12a..ba1be338 100644
--- a/SHADE_Engine/SHADE_Engine.vcxproj
+++ b/SHADE_Engine/SHADE_Engine.vcxproj
@@ -103,10 +103,12 @@
+
+
Create
diff --git a/SHADE_Engine/SHADE_Engine.vcxproj.filters b/SHADE_Engine/SHADE_Engine.vcxproj.filters
index b16c713b..6ca01248 100644
--- a/SHADE_Engine/SHADE_Engine.vcxproj.filters
+++ b/SHADE_Engine/SHADE_Engine.vcxproj.filters
@@ -10,11 +10,13 @@
Engine
+
Engine
+
\ No newline at end of file
diff --git a/SHADE_Engine/src/Filesystem/SHFileSystem.cpp b/SHADE_Engine/src/Filesystem/SHFileSystem.cpp
new file mode 100644
index 00000000..81ff6a8b
--- /dev/null
+++ b/SHADE_Engine/src/Filesystem/SHFileSystem.cpp
@@ -0,0 +1,75 @@
+#include "SHFileSystem.h"
+#include "fileapi.h"
+#include
+
+namespace SHADE
+{
+ char const FOLDER_MAX_COUNT {15};
+
+ std::unordered_map> SHFileSystem::folders;
+
+ SHFolder::SHFolder(FolderHandle id, FolderName name)
+ :id{id}, name{name}, subFolders(0)
+ {
+ }
+
+ FolderLocation SHFileSystem::CreateNewFolderHere(FolderName name, FolderLocation here) noexcept
+ {
+ if (here == 0)
+ {
+ if (!folders.contains(0))
+ {
+ folders[0] = std::make_unique(0, "root");
+ }
+
+ FolderCounter const count = static_cast(folders[here]->subFolders.size());
+
+ assert(count < FOLDER_MAX_COUNT, "Max subfolders reached\n");
+
+ FolderHandle const location = static_cast(count);
+
+ CreateFolderHelper(folders[0]->path, here, location, name);
+
+ return location;
+ }
+
+ assert(folders.contains(here), "Folder creation location does not exist/invalid\n");
+
+ FolderCounter const count = static_cast(folders[here]->subFolders.size());
+
+ FolderHandle location = here;
+ location <<= 4;
+ location |= count;
+
+ assert(count < FOLDER_MAX_COUNT, "Max subfolders reached\n");
+ CreateFolderHelper(folders[0]->path, here, location, name);
+
+ return location;
+ }
+
+ bool SHFileSystem::DeleteFolder(FolderLocation location) noexcept
+ {
+ assert(folders.contains(location), "Delete target does not exist/invalid.\n");
+
+ for (auto const& subFolder : folders[location]->subFolders)
+ {
+ DeleteFolder(subFolder);
+ }
+
+ RemoveDirectoryA(folders[location]->path.string().c_str());
+ return true;
+ }
+
+ bool SHFileSystem::CreateFolderHelper(FolderPath path, FolderLocation parent, FolderHandle location, FolderName name) noexcept
+ {
+ assert(
+ CreateDirectoryA(path.string().c_str(), nullptr),
+ "Failed to create folder\n"
+ );
+
+ folders[location] = std::make_unique(location, name);
+ folders[parent]->subFolders.push_back(location);
+
+ return true;
+ }
+}
diff --git a/SHADE_Engine/src/Filesystem/SHFileSystem.h b/SHADE_Engine/src/Filesystem/SHFileSystem.h
new file mode 100644
index 00000000..c58eb81e
--- /dev/null
+++ b/SHADE_Engine/src/Filesystem/SHFileSystem.h
@@ -0,0 +1,44 @@
+#pragma once
+
+#include
+#include
+#include
+#include
+#include
+
+namespace SHADE
+{
+ typedef unsigned char FolderCounter;
+ typedef unsigned char FileCounter;
+ typedef uint32_t FolderLocation;
+ typedef uint32_t FolderHandle;
+ typedef std::string FolderName;
+ typedef std::filesystem::path FolderPath;
+
+ class SHFolder
+ {
+ public:
+ SHFolder(FolderHandle id, FolderName name);
+
+ FolderHandle id;
+ FolderName name;
+ std::vector subFolders;
+
+ private:
+ FolderPath path;
+ friend class SHFileSystem;
+ };
+
+ class SHFileSystem
+ {
+ public:
+ static FolderLocation CreateNewFolderHere(FolderName name, FolderLocation here = 0) noexcept;
+
+ static bool DeleteFolder(FolderLocation location) noexcept;
+
+ private:
+ static std::unordered_map> folders;
+
+ static bool CreateFolderHelper(FolderPath path, FolderLocation parent, FolderHandle location, FolderName name) noexcept;
+ };
+}
\ No newline at end of file