/** * @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 = 0x03, /// @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /usr/local kUsrLocal = 0x04, /// @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /usr/local/rtis (используется для работ в проекте Сирена) kUsrLocalRtis = 0x05, /// @brief Исполняемый файл и сопутствующие каталоги находятся в иерахии /home kHome = 0x06, /// @brief Исполняемый файл и сопутствующие каталоги находятся в каталоге программного проекта kDevelopment = 0x07 }; public: Paths( const Paths& ) = delete; Paths& operator=( const Paths& ) = delete; Paths( Paths&& ) = delete; Paths& operator=( Paths&& ) = delete; /** * @brief getInstance * @return Уникальный экземпляр класса Paths */ static Paths& instance() { static Paths sPaths; return( sPaths ); } /** * @brief Обновление путей с учётом расположения исполняемого файла */ bool init(); /** * @brief Обновление путей с учётом расположения исполняемого файла * @param configFileName Имя файла настроек */ bool init( const QString& configFileName ); /** * @brief Обновление путей с учётом расположения исполняемого файла * @param projectName Имя проекта * @param configFileExtension Расширение для файла настроек */ bool init( const QString& projectName, const QString& configFileExtension ); /** * @brief Создание стандартных каталогов */ bool makeDefaultSystemDirectories(); bool makeDefaultUserDirectories(); bool makeDefaultDirectories(); /** * @brief Поиск существующего файла настойки. * Поиск выполняется до тех пор пока не будет найден файл в следующем порядке: * 1. Имя файла, указанное в качестве параметра функции * 2. Имя файла, заданное переменной окружения вида PROJECT_NAME_CONFIG * 3. Имя файла, полученное из внутренней переменной класса * Если файл настройки не будет найден, то будет возвращена пустая строка */ QString findConfigFile( const QString& defaultConfigFile = QLatin1String("") ); /** * @brief Полный путь к базовому каталогу */ const QString& prefixDirectory() const; /** * @brief Имя исполняемого файла */ const QString& executableName() const; /** * @brief Полный путь к исполняемому файлу */ const QString& executableFilePath() const; /** * @brief Полный путь к каталогу с исполняемым файлом */ const QString& executableDirectory() const; /** * @brief Имя файла настройки */ const QString& configFileName() const; /** * @brief Расширение у файла настройки */ const QString& configFileExtension() const; /** * @brief Полный путь к файлу настройки */ const QString& configFilePath() const; /** * @brief Полный путь к пользовательскому каталогу с файлами настройки */ const QString& userConfigDirectory() const; /** * @brief Полный путь к системному каталогу с файлами настройки */ const QString& systemConfigDirectory() const; /** * @brief Полный путь к пользовательскому каталогу с изменяемыми файлами */ const QString& userVarDataDirectory() const; /** * @brief Полный путь к системному каталогу с изменяемыми файлами */ const QString& systemVarDataDirectory() const; /** * @brief Полный путь к пользовательскому каталогу с неизменяемыми файлами */ const QString& userConstDataDirectory() const; /** * @brief Полный путь к системному каталогу с неизменяемыми файлами */ const QString& systemConstDataDirectory() const; /** * @brief Полный путь к пользовательскому каталогу с журналами работы */ const QString& userLogDirectory() const; /** * @brief Полный путь к системному каталогу с журналами работы */ const QString& systemLogDirectory() const; /** * @brief Полный путь к каталогу с временными файлами */ const QString& tempDirectory() const; /** * @brief Полный путь к домашнему каталогу текущего пользователя */ const QString& homeDirectory() const; /** * @brief Имя подкаталога для проекта */ const QString& projectName() const; protected: Paths(); ~Paths() = default; private: /// @brief Тип расположения файлов по каталогам HierarchyType m_hierarchyType { HierarchyType::kFlat }; /// @brief Имя проекта, которое используется при формировании имён файлов и каталогов QString m_projectName; QString m_executableName; QString m_executableFilePath; QString m_executableDirectory; /// @brief Общий префикс для файлов проекта QString m_prefixDirectory; /// @brief Путь к каталогу с временными файлами QString m_tempDirectory; /// @brief Путь к домашнему каталогу текущего пользователя QString m_homeDirectory; /// @brief Путь к пользовательскому каталогу с изменяемыми файлами QString m_userVarDataDirectory; /// @brief Путь к системному каталогу с изменяемыми файлами QString m_systemVarDataDirectory; /// @brief Путь к пользовательскому каталогу с неизменяемыми файлами QString m_userConstDataDirectory; /// @brief Путь к системному каталогу с неизменяемыми файлами QString m_systemConstDataDirectory; /// @brief Путь к пользовательскому каталогу с журналами работы QString m_userLogDirectory; /// @brief Путь к системному каталогу с журналами работы QString m_systemLogDirectory; /// @brief Путь к пользовательскому каталогу с файлами настройки QString m_userConfigDirectory; /// @brief Путь к системному каталогу с файлами настройки QString m_systemConfigDirectory; /// @brief Полный путь к файлу настройки QString m_configFilePath; /// @brief Имя файла настройки QString m_configFileName; void setupSystemDirectories( const QString& defaultPrefixDirectory, const QString& defaultEtcDirectory, const QString& defaultConstDataDirectory, const QString& defaultVarDataDirectory, const QString& defaultLogDirectory ); bool initCommon(); HierarchyType getHierarchyType(); }; // class Paths } // namespace filesystem } // namespace myx #endif // MYX_FILESYSTEM_PATHS_HPP_