/** * @file paths.hpp * @brief Стандартные пути к каталогам и файлам */ #ifndef MYX_FILESYSTEM_PATHS_HPP_ #define MYX_FILESYSTEM_PATHS_HPP_ #pragma once #include #include #include #include namespace myx { namespace filesystem { /// @brief Класс, предоставляющий методы для получения стандартных путей к каталогам и файлам class Paths { enum class HierarchyType : intptr_t { /// @brief Тип расположения файлов не определён kUndefined = 0x00, /// @brief Не определено ни одно из типовых размещений файлов /// @details Если исполняемый файл не находится в каталоге bin или не найдены /// необходимые сопутствующие каталоги, то предполается, /// что все файлы находятся в одном каталоге с исполняемым файлом kFlat = 0x01, /// @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /opt kOpt = 0x02, /// @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /usr kUsr = 0x04, /// @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /usr/local kUsrLocal = 0x08, /// @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /home kHome = 0x10, /// @brief Исполняемый файл и сопутствующие каталоги находятся в каталоге программного проекта kDevelopment = 0x20 }; /// @brief Тип расположения файлов по каталогам HierarchyType m_hierarchyType { HierarchyType::kFlat }; /// @brief Параметры текущего исполняемого файла CurrentExecutable m_currentExecutable; /// @brief Имя проекта, которое используется при формировании имён файлов и каталогов QString m_projectName; /// @brief Путь к каталогу с временными файлами QDir m_tempDirectory; /// @brief Путь к домашнему каталогу текущего пользователя QDir m_homeDirectory; /// @brief Путь к пользовательскому каталогу с изменяемыми файлами QDir m_userVarDataDirectory; /// @brief Путь к системному каталогу с изменяемыми файлами QDir m_systemVarDataDirectory; /// @brief Путь к пользовательскому каталогу с неизменяемыми файлами QDir m_userConstDataDirectory; /// @brief Путь к системному каталогу с неизменяемыми файлами QDir m_systemConstDataDirectory; /// @brief Путь к пользовательскому каталогу с журналами работы QDir m_userLogDirectory; /// @brief Путь к системному каталогу с журналами работы QDir m_systemLogDirectory; /// @brief Путь к пользовательскому каталогу с файлами настройки QDir m_userConfigDirectory; /// @brief Путь к системному каталогу с файлами настройки QDir m_systemConfigDirectory; /// @brief Полный путь к файлу настройки QFileInfo m_configFilePath; /// @brief Имя файла настройки QString m_configFileName; /// @brief Расширение для файла настройки QString m_configFileExtension; HierarchyType getHierarchyType(); protected: Paths(); ~Paths() = default; Paths( const Paths& ) = delete; Paths& operator=( const Paths& ) = delete; public: /** * @brief getInstance * @return Уникальный экземпляр класса Paths */ static Paths& instance() { static Paths p; return( p ); } /** * @brief Обновление путей с учётом расположения исполняемого файла */ bool init( const QString& projectDir, const QString& configFileExtension = QStringLiteral("conf") ); /** * @brief Создание стандартных каталогов */ bool makeDefaultDirectories(); /** * @brief Поиск существующего файла настойки. * Поиск выполняется до тех пор пока не будет найден файл в следующем порядке: * 1. Имя файла, указанное в качестве параметра функции * 2. Имя файла, заданное переменной окружения вида PROJECT_NAME_CONFIG * 3. Имя файла, полученное из внутренней переменной класса * Если файл настройки не будет найден, то будет возвращена пустая строка */ QString findConfigFile( const QString& defaultConfigFile = QLatin1String("") ); /** * @brief Полный путь к базовому каталогу */ const QDir& prefixDirectory() const; /** * @brief Полный путь к каталогу с исполняемым файлом */ QDir executableFileDirectory() const; /** * @brief Полный путь к пользовательскому каталогу с файлами настройки */ const QDir& userConfigDirectory() const; /** * @brief Полный путь к системному каталогу с файлами настройки */ const QDir& systemConfigDirectory() const; /** * @brief Полный путь к файлу настройки */ const QFileInfo& configFilePath() const; /** * @brief Имя файла настройки */ const QString& configFileName() const; /** * @brief Расширение у файла настройки */ const QString& configFileExtension() const; /** * @brief Полный путь к пользовательскому каталогу с изменяемыми файлами */ const QDir& userVarDataDirectory() const; /** * @brief Полный путь к системному каталогу с изменяемыми файлами */ const QDir& systemVarDataDirectory() const; /** * @brief Полный путь к пользовательскому каталогу с неизменяемыми файлами */ const QDir& userConstDataDirectory() const; /** * @brief Полный путь к системному каталогу с неизменяемыми файлами */ const QDir& systemConstDataDirectory() const; /** * @brief Полный путь к пользовательскому каталогу с журналами работы */ const QDir& userLogDirectory() const; /** * @brief Полный путь к системному каталогу с журналами работы */ const QDir& systemLogDirectory() const; /** * @brief Полный путь к каталогу с временными файлами */ const QDir& tempDirectory() const; /** * @brief Полный путь к домашнему каталогу текущего пользователя */ const QDir& homeDirectory() const; /** * @brief Имя подкаталога для проекта */ const QString& projectName() const; /** * @brief Имя исполняемого файла */ QString executableFileName() const; /** * @brief Полный путь к исполняемому файлу */ const QFileInfo& executableFilePath() const; }; // class Paths } // namespace filesystem } // namespace myx #endif // MYX_FILESYSTEM_PATHS_HPP_