myxlib/src/myx/filesystem/paths.hpp

250 lines
9.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file paths.hpp
* @brief Стандартные пути к каталогам и файлам
*/
#ifndef MYX_FILESYSTEM_PATHS_HPP_
#define MYX_FILESYSTEM_PATHS_HPP_
#pragma once
#include <myx/core/config.hpp>
#include <QDir>
#include <QFileInfo>
#include <QString>
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_