From 6afc8c719d153ad2896b38e3bd123dd0717f29f2 Mon Sep 17 00:00:00 2001 From: Yimura Date: Mon, 21 Feb 2022 18:03:44 +0100 Subject: [PATCH] feat(FileManager): Added FileManager for easier file management --- BigBaseV2/src/file_manager.hpp | 71 +++++++++++++++++++++++++++ BigBaseV2/src/file_manager/file.cpp | 41 ++++++++++++++++ BigBaseV2/src/file_manager/file.hpp | 28 +++++++++++ BigBaseV2/src/file_manager/folder.cpp | 33 +++++++++++++ BigBaseV2/src/file_manager/folder.hpp | 30 +++++++++++ 5 files changed, 203 insertions(+) create mode 100644 BigBaseV2/src/file_manager.hpp create mode 100644 BigBaseV2/src/file_manager/file.cpp create mode 100644 BigBaseV2/src/file_manager/file.hpp create mode 100644 BigBaseV2/src/file_manager/folder.cpp create mode 100644 BigBaseV2/src/file_manager/folder.hpp diff --git a/BigBaseV2/src/file_manager.hpp b/BigBaseV2/src/file_manager.hpp new file mode 100644 index 00000000..d414c2b4 --- /dev/null +++ b/BigBaseV2/src/file_manager.hpp @@ -0,0 +1,71 @@ +#pragma once +#include "common.hpp" +#include "file_manager/file.hpp" +#include "file_manager/folder.hpp" + +namespace big +{ + class file_manager; + inline file_manager* g_file_manager{}; + + class file_manager final + { + public: + + file_manager(std::filesystem::path base_dir) + : m_base_dir(base_dir) + { + file_manager::ensure_folder_exists(m_base_dir); + + g_file_manager = this; + } + ~file_manager() + { + g_file_manager = nullptr; + } + + std::filesystem::path get_base_dir() + { + return m_base_dir; + } + + file get_project_file(std::filesystem::path file_path) + { + if (file_path.is_absolute()) + throw std::exception("Project files are relative to the BaseDir, don't use absolute paths!"); + + return file(this, file_path); + } + folder get_project_folder(std::filesystem::path folder_path) + { + if (folder_path.is_absolute()) + throw std::exception("Project folders are relative to the BaseDir, don't use absolute paths!"); + + return folder(this, folder_path); + } + + static std::filesystem::path ensure_file_can_be_created(const std::filesystem::path file_path) + { + file_manager::ensure_folder_exists(file_path.parent_path()); + + return file_path; + } + static std::filesystem::path ensure_folder_exists(const std::filesystem::path folder_path) + { + bool create_path = !std::filesystem::exists(folder_path); + + if (!create_path && !std::filesystem::is_directory(folder_path)) + { + std::filesystem::remove(folder_path); + create_path = true; + } + if (create_path) + std::filesystem::create_directory(folder_path); + + return folder_path; + } + + private: + std::filesystem::path m_base_dir; + }; +} \ No newline at end of file diff --git a/BigBaseV2/src/file_manager/file.cpp b/BigBaseV2/src/file_manager/file.cpp new file mode 100644 index 00000000..89874f58 --- /dev/null +++ b/BigBaseV2/src/file_manager/file.cpp @@ -0,0 +1,41 @@ +#include "common.hpp" +#include "file.hpp" +#include "file_manager.hpp" + +namespace big +{ + file::file(file_manager* file_manager, std::filesystem::path file_path) + : file(file_manager->get_base_dir() / file_path) + { + m_is_project_file = true; + } + + file::file(std::filesystem::path file_path) + : m_file_path(file_manager::ensure_file_can_be_created(file_path)), m_is_project_file(false) + { + + } + + bool file::exists() const + { + return std::filesystem::exists(m_file_path); + } + + const std::filesystem::path file::get_path() const + { + return m_file_path; + } + + file file::move(std::filesystem::path new_path) + { + if (new_path.is_relative()) + new_path = m_file_path.parent_path() / new_path; + + file_manager::ensure_file_can_be_created(new_path); + + if (std::filesystem::exists(m_file_path)) + std::filesystem::rename(m_file_path, new_path); + + return { new_path }; + } +} \ No newline at end of file diff --git a/BigBaseV2/src/file_manager/file.hpp b/BigBaseV2/src/file_manager/file.hpp new file mode 100644 index 00000000..0f98c7b6 --- /dev/null +++ b/BigBaseV2/src/file_manager/file.hpp @@ -0,0 +1,28 @@ +#pragma once + +namespace big +{ + class file_manager; + + class file + { + public: + + file(std::filesystem::path file_path); + + file copy(std::filesystem::path new_path); + bool exists() const; + const std::filesystem::path get_path() const; + file move(std::filesystem::path new_path); + + protected: + file(file_manager* file_manager, std::filesystem::path file_path); + + private: + friend class file_manager; + + bool m_is_project_file; + std::filesystem::path m_file_path; + + }; +} \ No newline at end of file diff --git a/BigBaseV2/src/file_manager/folder.cpp b/BigBaseV2/src/file_manager/folder.cpp new file mode 100644 index 00000000..3030e517 --- /dev/null +++ b/BigBaseV2/src/file_manager/folder.cpp @@ -0,0 +1,33 @@ +#include "file_manager.hpp" +#include "folder.hpp" + +namespace big +{ + folder::folder(file_manager* file_manager, std::filesystem::path file_path) + : folder(file_manager->get_base_dir() / file_path) + { + m_file_manager = file_manager; + m_is_project_file = true; + } + + folder::folder(std::filesystem::path folder_path) + : m_folder_path(file_manager::ensure_folder_exists(folder_path)) + { + + } + + file folder::get_file(std::filesystem::path file_path) const + { + if (file_path.is_absolute()) + throw std::exception("folder#get_file requires a relative path."); + + return file( + m_folder_path / file_path + ); + } + + const std::filesystem::path folder::get_path() const + { + return m_folder_path; + } +} \ No newline at end of file diff --git a/BigBaseV2/src/file_manager/folder.hpp b/BigBaseV2/src/file_manager/folder.hpp new file mode 100644 index 00000000..58c5cddd --- /dev/null +++ b/BigBaseV2/src/file_manager/folder.hpp @@ -0,0 +1,30 @@ +#pragma once + +namespace big +{ + class file; + class file_manager; + + class folder + { + + public: + folder(std::filesystem::path folder_path); + + file get_file(std::filesystem::path file_path) const; + const std::filesystem::path get_path() const; + + protected: + folder(file_manager* file_manager, std::filesystem::path file_path); + + private: + + friend class file_manager; + file_manager* m_file_manager; + + bool m_is_project_file; + + std::filesystem::path m_folder_path; + + }; +} \ No newline at end of file