myxlib/src/myx/filesystem/paths.hpp

222 lines
8.0 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/filesystem/current_executable.hpp>
#include <QString>
#include <QDir>
#include <QFileInfo>
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_