From 5e89ce586c4959d4e962ecba17a89208846c4f17 Mon Sep 17 00:00:00 2001 From: OmniaX-Dev Date: Fri, 20 Mar 2026 21:20:18 +0100 Subject: [PATCH] Expanded ostd::FileSystem functionality --- other/build.nr | 2 +- src/ostd/io/FileSystem.cpp | 235 ++++++++++++++++++++++++++++--------- src/ostd/io/FileSystem.hpp | 11 +- 3 files changed, 192 insertions(+), 56 deletions(-) diff --git a/other/build.nr b/other/build.nr index c533c5e..cfa5180 100644 --- a/other/build.nr +++ b/other/build.nr @@ -1 +1 @@ -2021 +2022 diff --git a/src/ostd/io/FileSystem.cpp b/src/ostd/io/FileSystem.cpp index 7bebc03..ce0e14e 100644 --- a/src/ostd/io/FileSystem.cpp +++ b/src/ostd/io/FileSystem.cpp @@ -1,5 +1,6 @@ #include "FileSystem.hpp" #include "Logger.hpp" +#include namespace ostd { @@ -68,11 +69,11 @@ namespace ostd { String home_path = ""; #ifdef WINDOWS_OS - home_path = String(getenv("HOMEDRIVE")) + "\\" + String(getenv("HOMEPATH")); + home_path = String(getenv("HOMEDRIVE")) + "\\" + String(getenv("HOMEPATH")); #elif defined(LINUX_OS) || defined(MAC_OS) - home_path = String(getenv("HOME")); + home_path = String(getenv("HOME")); #else - home_path = "NULL"; + home_path = "NULL"; #endif return home_path; } @@ -83,50 +84,120 @@ namespace ostd } - bool FileSystem::ensureDirectory(const String& path) + bool FileSystem::ensureDirectory(const String& directoryPath) { - namespace fs = std::filesystem; + namespace fs = std::filesystem; - try { - fs::path dir(path); + try { + fs::path dir(directoryPath); - if (!fs::exists(dir)) - { - if (!fs::create_directories(dir)) - { - OX_ERROR("Failed to create directory: %s", path.c_str()); + if (!fs::exists(dir)) + { + if (!fs::create_directories(dir)) + { + OX_ERROR("Failed to create directory: %s", directoryPath.c_str()); return false; - } - } - else if (!fs::is_directory(dir)) - { - OX_ERROR("Path exists but is not a directory: %s", path.c_str()); + } + } + else if (!fs::is_directory(dir)) + { + OX_ERROR("Path exists but is not a directory: %s", directoryPath.c_str()); return false; - } - } - catch (const fs::filesystem_error& e) - { - OX_ERROR("Filesystem error for path '%s': %s", path.c_str(), e.what()); + } + } + catch (const fs::filesystem_error& e) + { + OX_ERROR("Filesystem error for path '%s': %s", directoryPath.c_str(), e.what()); return false; - } + } return true; } - bool FileSystem::deleteDirectory(const String& path) + bool FileSystem::deleteDirectory(const String& directoryPath) { - namespace fs = std::filesystem; - try - { - if (fs::exists(path) && fs::is_directory(path)) - { - fs::remove_all(path); + namespace fs = std::filesystem; + try + { + if (fs::exists(directoryPath) && fs::is_directory(directoryPath)) + { + fs::remove_all(directoryPath); return true; - } - } catch (const fs::filesystem_error& e) - { - OX_ERROR("Failed to delete tmp folder '%s': %s", path.c_str(), e.what()); + } + } catch (const fs::filesystem_error& e) + { + OX_ERROR("Failed to delete folder '%s': %s", directoryPath.c_str(), e.what()); return false; - } + } + return false; + } + + bool FileSystem::ensureFile(const String& filePath, bool truncate) + { + namespace fs = std::filesystem; + try + { + fs::path p(filePath); + if (p.empty()) + { + OX_ERROR("Invalid file path: '%s'", filePath.c_str()); + return false; + } + fs::path parent = p.parent_path(); + if (parent.empty() || !fs::exists(parent) || !fs::is_directory(parent)) + { + OX_ERROR("Parent directory does not exist for file: '%s'", filePath.c_str()); + return false; + } + if (fs::exists(p)) + { + if (fs::is_directory(p)) + { + OX_ERROR("Path exists but is a directory: '%s'", filePath.c_str()); + return false; + } + if (!truncate) + return true; + std::ofstream ofs(p, std::ios::trunc); + if (!ofs) + { + OX_ERROR("Failed to truncate file: '%s'", filePath.c_str()); + return false; + } + return true; + } + else + { + std::ofstream ofs(p); + if (!ofs) + { + OX_ERROR("Failed to create file: '%s'", filePath.c_str()); + return false; + } + return true; + } + } + catch (const fs::filesystem_error& e) + { + OX_ERROR("Filesystem error for file '%s': %s", filePath.c_str(), e.what()); + return false; + } + } + + bool FileSystem::deleteFile(const String& filePath) + { + namespace fs = std::filesystem; + try + { + if (fs::exists(filePath) && !fs::is_directory(filePath)) + { + fs::remove(filePath); + return true; + } + } catch (const fs::filesystem_error& e) + { + OX_ERROR("Failed to delete file '%s': %s", filePath.c_str(), e.what()); + return false; + } return false; } @@ -134,42 +205,100 @@ namespace ostd bool FileSystem::directoryExists(const String& directoryPath) { namespace fs = std::filesystem; - try + try { - fs::path p(directoryPath); - return fs::exists(p) && fs::is_directory(p); - } + fs::path p(directoryPath); + return fs::exists(p) && fs::is_directory(p); + } catch (const fs::filesystem_error&) { - return false; - } + return false; + } } bool FileSystem::fileExists(const String& filePath) { namespace fs = std::filesystem; - try + try { - fs::path p(filePath); - return fs::exists(p) && !fs::is_directory(p); - } + fs::path p(filePath); + return fs::exists(p) && !fs::is_directory(p); + } catch (const fs::filesystem_error&) { - return false; - } + return false; + } } bool FileSystem::pathExists(const String& path) { namespace fs = std::filesystem; - try + try { - fs::path p(path); - return fs::exists(p); - } + fs::path p(path); + return fs::exists(p); + } catch (const fs::filesystem_error&) { - return false; - } + return false; + } + } + + bool FileSystem::isValidFileCreationPath(const ostd::String& filePath) + { + namespace fs = std::filesystem; + try + { + fs::path p(filePath); + if (p.empty()) + return false; + fs::path parent = p.parent_path(); + if (parent.empty()) + return false; + if (!fs::exists(parent) || !fs::is_directory(parent)) + return false; + if (fs::exists(p) && !fs::is_regular_file(p)) + return false; + return true; + } + catch (const fs::filesystem_error&) + { + return false; + } + } + + bool FileSystem::isValidDirectoryCreationPath(const ostd::String& directoryPath) + { + namespace fs = std::filesystem; + try { + fs::path p(directoryPath); + if (p.empty()) + return false; + fs::path parent = p.parent_path(); + if (parent.empty()) + return false; + if (!fs::exists(parent) || !fs::is_directory(parent)) + return false; + if (fs::exists(p)) + return false; + return true; + } + catch (const fs::filesystem_error&) + { + return false; + } + } + + FileSystem::ePathStatus FileSystem::getPathStatus(const ostd::String& path) + { + if (directoryExists(path)) + return ePathStatus::ExistingDirectory; + if (fileExists(path)) + return ePathStatus::ExistingFile; + if (isValidDirectoryCreationPath(path)) + return ePathStatus::ValidNewDirectory; + if (isValidFileCreationPath(path)) + return ePathStatus::ValidNewFile; + return ePathStatus::Invalid; } } diff --git a/src/ostd/io/FileSystem.hpp b/src/ostd/io/FileSystem.hpp index c94e5ce..3fee6e8 100644 --- a/src/ostd/io/FileSystem.hpp +++ b/src/ostd/io/FileSystem.hpp @@ -28,6 +28,8 @@ namespace ostd { class FileSystem { + public: enum class ePathStatus { Invalid = 0, ExistingDirectory, ValidNewDirectory, ExistingFile, ValidNewFile }; + public: static std::vector listFilesInDirectory(const String& directoryPath); static std::vector listDirectoriesInDirectory(const String& directoryPath); @@ -39,11 +41,16 @@ namespace ostd static std::filesystem::path getHomeDirPath(void); static std::filesystem::path getWorkingDirPath(void); - static bool ensureDirectory(const String& path); - static bool deleteDirectory(const String& path); + static bool ensureDirectory(const String& directoryPath); + static bool deleteDirectory(const String& directoryPath); + static bool ensureFile(const String& filePath, bool truncate = true); + static bool deleteFile(const String& filePath); static bool directoryExists(const String& directoryPath); static bool fileExists(const String& filePath); static bool pathExists(const String& path); + static bool isValidFileCreationPath(const ostd::String& filePath); + static bool isValidDirectoryCreationPath(const ostd::String& directoryPath); + static ePathStatus getPathStatus(const ostd::String& path); }; }