2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
|
|
|
|
* @file paths.hpp
|
|
|
|
|
* @brief Стандартные пути к каталогам и файлам
|
|
|
|
|
*/
|
|
|
|
|
|
2019-10-02 11:29:10 +00:00
|
|
|
|
#ifndef MYX_FILESYSTEM_PATHS_HPP_
|
|
|
|
|
#define MYX_FILESYSTEM_PATHS_HPP_
|
|
|
|
|
|
2020-04-01 22:29:39 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
2019-11-25 12:08:34 +00:00
|
|
|
|
#include <myx/filesystem/current_executable.hpp>
|
|
|
|
|
|
2019-10-04 09:48:12 +00:00
|
|
|
|
#include <QString>
|
|
|
|
|
#include <QDir>
|
|
|
|
|
#include <QFileInfo>
|
2019-10-02 11:29:10 +00:00
|
|
|
|
|
2020-04-03 21:04:02 +00:00
|
|
|
|
#include <atomic>
|
|
|
|
|
#include <future>
|
|
|
|
|
#include <mutex>
|
|
|
|
|
#include <thread>
|
2020-04-01 22:29:39 +00:00
|
|
|
|
|
2019-10-02 11:29:10 +00:00
|
|
|
|
namespace myx {
|
|
|
|
|
|
|
|
|
|
namespace filesystem {
|
|
|
|
|
|
2019-10-04 09:48:12 +00:00
|
|
|
|
class Paths
|
|
|
|
|
{
|
2020-04-03 21:04:02 +00:00
|
|
|
|
enum class HierarchyType : intptr_t
|
|
|
|
|
{
|
|
|
|
|
kSplit = 0x00,
|
|
|
|
|
kFlat = 0x01,
|
|
|
|
|
kOpt = 0x02,
|
|
|
|
|
kStandard = 0x04,
|
|
|
|
|
kUser = 0x08,
|
|
|
|
|
kHome = 0x10,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/// @brief Тип расположения файлов по каталогам
|
|
|
|
|
HierarchyType m_hierarchyType { HierarchyType::kFlat };
|
|
|
|
|
|
|
|
|
|
/// @brief Параметры текущего исполняемого файла
|
|
|
|
|
CurrentExecutable m_currentExecutable;
|
2020-04-01 22:29:39 +00:00
|
|
|
|
|
2020-04-03 21:04:02 +00:00
|
|
|
|
/// @brief Имя проекта, которое используется при формировании имён файлов и каталогов
|
|
|
|
|
QString m_projectName;
|
|
|
|
|
|
|
|
|
|
/// @brief Путь к каталогу с временными файлами
|
|
|
|
|
QDir m_tempDirectory;
|
|
|
|
|
/// @brief Путь к домашнему каталогу текущего пользователя
|
|
|
|
|
QDir m_homeDirectory;
|
2019-10-04 09:48:12 +00:00
|
|
|
|
|
2020-04-01 22:29:39 +00:00
|
|
|
|
/// @brief Путь к пользовательскому каталогу с изменяемыми файлами
|
|
|
|
|
QDir m_userVarDataDirectory;
|
|
|
|
|
/// @brief Путь к системному каталогу с изменяемыми файлами
|
|
|
|
|
QDir m_systemVarDataDirectory;
|
|
|
|
|
|
|
|
|
|
/// @brief Путь к пользовательскому каталогу с неизменяемыми файлами
|
|
|
|
|
QDir m_userConstDataDirectory;
|
|
|
|
|
/// @brief Путь к системному каталогу с неизменяемыми файлами
|
|
|
|
|
QDir m_systemConstDataDirectory;
|
|
|
|
|
|
|
|
|
|
/// @brief Путь к пользовательскому каталогу с журналами работы
|
|
|
|
|
QDir m_userLogDirectory;
|
|
|
|
|
/// @brief Путь к системному каталогу с журналами работы
|
|
|
|
|
QDir m_systemLogDirectory;
|
|
|
|
|
|
2020-04-03 21:04:02 +00:00
|
|
|
|
/// @brief Путь к пользовательскому каталогу с файлами настройки
|
|
|
|
|
QDir m_userConfigDirectory;
|
|
|
|
|
/// @brief Путь к системному каталогу с файлами настройки
|
|
|
|
|
QDir m_systemConfigDirectory;
|
2020-04-01 22:29:39 +00:00
|
|
|
|
|
2020-04-03 21:04:02 +00:00
|
|
|
|
/// @brief Полный путь к файлу настройки
|
|
|
|
|
QFileInfo m_configFilePath;
|
|
|
|
|
/// @brief Имя файла настройки
|
|
|
|
|
QString m_configFileName;
|
|
|
|
|
/// @brief Расширение для файла настройки
|
|
|
|
|
QString m_configFileExtension;
|
|
|
|
|
|
|
|
|
|
Paths();
|
|
|
|
|
~Paths() = default;
|
|
|
|
|
Paths( const Paths& ) = delete;
|
|
|
|
|
Paths& operator=( const Paths& ) = delete;
|
|
|
|
|
|
|
|
|
|
HierarchyType getHierarchyType();
|
|
|
|
|
|
|
|
|
|
static std::atomic< Paths* > m_instance;
|
|
|
|
|
static std::mutex m_mutex;
|
2019-11-25 12:08:34 +00:00
|
|
|
|
|
2019-10-04 09:48:12 +00:00
|
|
|
|
public:
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
2020-04-03 21:04:02 +00:00
|
|
|
|
* @brief getInstance
|
|
|
|
|
* @return Уникальный экземпляр класса Paths
|
2019-11-25 13:57:54 +00:00
|
|
|
|
*/
|
2020-04-03 21:04:02 +00:00
|
|
|
|
static Paths* getInstance()
|
|
|
|
|
{
|
|
|
|
|
Paths* localInstance = m_instance.load( std::memory_order_acquire );
|
|
|
|
|
if ( !localInstance )
|
|
|
|
|
{
|
|
|
|
|
std::lock_guard< std::mutex > myLock( m_mutex );
|
|
|
|
|
localInstance = m_instance.load( std::memory_order_relaxed );
|
|
|
|
|
if ( !localInstance )
|
|
|
|
|
{
|
|
|
|
|
localInstance = new Paths();
|
|
|
|
|
m_instance.store( localInstance, std::memory_order_release );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return( localInstance );
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-01 22:29:39 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Обновление путей с учётом расположения исполняемого файла
|
|
|
|
|
*/
|
2020-04-03 21:04:02 +00:00
|
|
|
|
bool init( const QString& projectDir, const QString& configFileExtension = "conf" );
|
2020-04-01 22:29:39 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Создание стандартных каталогов
|
|
|
|
|
*/
|
|
|
|
|
bool makeDefaultDirectories();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Поиск существующего файла настойки.
|
|
|
|
|
* Поиск выполняется до тех пор пока не будет найден файл в следующем порядке:
|
|
|
|
|
* 1. Имя файла, указанное в качестве параметра функции
|
|
|
|
|
* 2. Имя файла, заданное переменной окружения вида PROJECT_NAME_CONFIG
|
|
|
|
|
* 3. Имя файла, полученное из внутренней переменной класса
|
|
|
|
|
* Если файл настройки не будет найден, то будет возвращена пустая строка
|
|
|
|
|
*/
|
|
|
|
|
QString findConfigFile( const QString& defaultConfigFile = "" );
|
|
|
|
|
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief Получение пути к базовому каталогу
|
|
|
|
|
*/
|
2020-04-01 22:29:39 +00:00
|
|
|
|
const QDir& prefixDirectory() const;
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief Установка пути к базовому каталогу
|
|
|
|
|
*/
|
2019-10-04 09:48:12 +00:00
|
|
|
|
void setPrefixDirectory( const QString& prefixDirectory );
|
2020-04-01 22:29:39 +00:00
|
|
|
|
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief Получение пути к каталогу с исполняемым файлом
|
|
|
|
|
*/
|
2020-04-03 21:04:02 +00:00
|
|
|
|
QDir binaryDirectory() const;
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief Установка пути к каталогу с исполняемым файлом
|
|
|
|
|
*/
|
2019-10-04 09:48:12 +00:00
|
|
|
|
void setBinaryDirectory( const QString& binaryDirectory );
|
2020-04-01 22:29:39 +00:00
|
|
|
|
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
2020-04-01 22:29:39 +00:00
|
|
|
|
* @brief Получение пути к пользовательскому каталогу с файлами настройки
|
2019-11-25 13:57:54 +00:00
|
|
|
|
*/
|
2020-04-01 22:29:39 +00:00
|
|
|
|
const QDir& userConfigDirectory() const;
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
2020-04-01 22:29:39 +00:00
|
|
|
|
* @brief Установка пути к пользовательскому каталогу с файлами настройки
|
2019-11-25 13:57:54 +00:00
|
|
|
|
*/
|
2020-04-01 22:29:39 +00:00
|
|
|
|
void setUserConfigDirectory( const QString& userConfigDirectory );
|
|
|
|
|
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
2020-04-01 22:29:39 +00:00
|
|
|
|
* @brief Получение пути к системному каталогу с файлами настройки
|
2019-11-25 13:57:54 +00:00
|
|
|
|
*/
|
2020-04-01 22:29:39 +00:00
|
|
|
|
const QDir& systemConfigDirectory() const;
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
2020-04-01 22:29:39 +00:00
|
|
|
|
* @brief Установка пути к системному каталогу с файлами настройки
|
2019-11-25 13:57:54 +00:00
|
|
|
|
*/
|
2020-04-01 22:29:39 +00:00
|
|
|
|
void setSystemConfigDirectory( const QString& systemConfigDirectory );
|
|
|
|
|
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
2020-04-01 22:29:39 +00:00
|
|
|
|
* @brief Получение пути к локальному каталогу с файлами настройки
|
2019-11-25 13:57:54 +00:00
|
|
|
|
*/
|
2020-04-01 22:29:39 +00:00
|
|
|
|
const QDir& localConfigDirectory() const;
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
2020-04-01 22:29:39 +00:00
|
|
|
|
* @brief Установка пути к локальному каталогу с файлами настройки
|
2019-11-25 13:57:54 +00:00
|
|
|
|
*/
|
2020-04-01 22:29:39 +00:00
|
|
|
|
void setLocalConfigDirectory( const QString& localConfigDirectory );
|
|
|
|
|
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
2020-04-01 22:29:39 +00:00
|
|
|
|
* @brief Полный путь к файлу настройки
|
2019-11-25 13:57:54 +00:00
|
|
|
|
*/
|
2020-04-01 22:29:39 +00:00
|
|
|
|
const QFileInfo& configFilePath() const;
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
2020-04-01 22:29:39 +00:00
|
|
|
|
* @brief Установка полного пути к файлу настройки
|
2019-11-25 13:57:54 +00:00
|
|
|
|
*/
|
2020-04-01 22:29:39 +00:00
|
|
|
|
void setConfigFilePath( const QFileInfo& configFilePath );
|
|
|
|
|
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
2020-04-01 22:29:39 +00:00
|
|
|
|
* @brief Имя файла настройки
|
2019-11-25 13:57:54 +00:00
|
|
|
|
*/
|
2020-04-01 22:29:39 +00:00
|
|
|
|
const QString& configFileName() const;
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
2020-04-01 22:29:39 +00:00
|
|
|
|
* @brief Установка имени файла настройки
|
2019-11-25 13:57:54 +00:00
|
|
|
|
*/
|
2020-04-01 22:29:39 +00:00
|
|
|
|
void setConfigFileName( const QString& configFileName );
|
|
|
|
|
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
2020-04-01 22:29:39 +00:00
|
|
|
|
* @brief Расширение у файла настройки
|
2019-11-25 13:57:54 +00:00
|
|
|
|
*/
|
2020-04-01 22:29:39 +00:00
|
|
|
|
const QString& configFileExtension() const;
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
2020-04-01 22:29:39 +00:00
|
|
|
|
* @brief Установка расширения у файла настройки
|
2019-11-25 13:57:54 +00:00
|
|
|
|
*/
|
2020-04-01 22:29:39 +00:00
|
|
|
|
void setConfigFileExtension( const QString& configFileExtension );
|
|
|
|
|
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
2020-04-01 22:29:39 +00:00
|
|
|
|
* @brief Получение пути к пользовательскому каталогу с изменяемыми файлами
|
2019-11-25 13:57:54 +00:00
|
|
|
|
*/
|
2020-04-01 22:29:39 +00:00
|
|
|
|
const QDir& userVarDataDirectory() const;
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
2020-04-01 22:29:39 +00:00
|
|
|
|
* @brief Установка пути к пользовательскому каталогу с изменяемыми файлами
|
2019-11-25 13:57:54 +00:00
|
|
|
|
*/
|
2020-04-01 22:29:39 +00:00
|
|
|
|
void setUserVarDataDirectory( const QString& userVarDataDirectory );
|
|
|
|
|
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
2020-04-01 22:29:39 +00:00
|
|
|
|
* @brief Получение пути к системному каталогу с изменяемыми файлами
|
2019-11-25 13:57:54 +00:00
|
|
|
|
*/
|
2020-04-01 22:29:39 +00:00
|
|
|
|
const QDir& systemVarDataDirectory() const;
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
2020-04-01 22:29:39 +00:00
|
|
|
|
* @brief Установка пути к системному каталогу с изменяемыми файлами
|
2019-11-25 13:57:54 +00:00
|
|
|
|
*/
|
2020-04-01 22:29:39 +00:00
|
|
|
|
void setSystemVarDataDirectory( const QString& systemVarDataDirectory );
|
2019-10-04 09:48:12 +00:00
|
|
|
|
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
2020-04-01 22:29:39 +00:00
|
|
|
|
* @brief Получение пути к локальному каталогу с изменяемыми файлами
|
2019-11-25 13:57:54 +00:00
|
|
|
|
*/
|
2020-04-01 22:29:39 +00:00
|
|
|
|
const QDir& localVarDataDirectory() const;
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
2020-04-01 22:29:39 +00:00
|
|
|
|
* @brief Установка пути к локальному каталогу с изменяемыми файлами
|
2019-11-25 13:57:54 +00:00
|
|
|
|
*/
|
2020-04-01 22:29:39 +00:00
|
|
|
|
void setLocalVarDataDirectory( const QString& localVarDataDirectory );
|
2019-10-09 03:00:33 +00:00
|
|
|
|
|
2019-11-25 13:57:54 +00:00
|
|
|
|
/**
|
2020-04-01 22:29:39 +00:00
|
|
|
|
* @brief Получение пути к пользовательскому каталогу с неизменяемыми файлами
|
2019-11-25 13:57:54 +00:00
|
|
|
|
*/
|
2020-04-01 22:29:39 +00:00
|
|
|
|
const QDir& userConstDataDirectory() const;
|
|
|
|
|
/**
|
|
|
|
|
* @brief Установка пути к пользовательскому каталогу с неизменяемыми файлами
|
|
|
|
|
*/
|
|
|
|
|
void setUserConstDataDirectory( const QString& userConstDataDirectory );
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Получение пути к системному каталогу с неизменяемыми файлами
|
|
|
|
|
*/
|
|
|
|
|
const QDir& systemConstDataDirectory() const;
|
|
|
|
|
/**
|
|
|
|
|
* @brief Установка пути к системному каталогу с неизменяемыми файлами
|
|
|
|
|
*/
|
|
|
|
|
void setSystemConstDataDirectory( const QString& systemConstDataDirectory );
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Получение пути к локальному каталогу с неизменяемыми файлами
|
|
|
|
|
*/
|
|
|
|
|
const QDir& localConstDataDirectory() const;
|
|
|
|
|
/**
|
|
|
|
|
* @brief Установка пути к локальному каталогу с неизменяемыми файлами
|
|
|
|
|
*/
|
|
|
|
|
void setLocalConstDataDirectory( const QString& localConstDataDirectory );
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Получение пути к пользовательскому каталогу с журналами работы
|
|
|
|
|
*/
|
|
|
|
|
const QDir& userLogDirectory() const;
|
|
|
|
|
/**
|
|
|
|
|
* @brief Установка пути к пользовательскому каталогу с журналами работы
|
|
|
|
|
*/
|
|
|
|
|
void setUserLogDirectory( const QString& userLogDirectory );
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Получение пути к системному каталогу с журналами работы
|
|
|
|
|
*/
|
|
|
|
|
const QDir& systemLogDirectory() const;
|
|
|
|
|
/**
|
|
|
|
|
* @brief Установка пути к системному каталогу с журналами работы
|
|
|
|
|
*/
|
|
|
|
|
void setSystemLogDirectory( const QString& systemLogDirectory );
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Получение пути к локальному каталогу с журналами работы
|
|
|
|
|
*/
|
|
|
|
|
const QDir& localLogDirectory() const;
|
|
|
|
|
/**
|
|
|
|
|
* @brief Установка пути к локальному каталогу с журналами работы
|
|
|
|
|
*/
|
|
|
|
|
void setLocalLogDirectory( const QString& localLogDirectory );
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Получение пути к каталогу с временными файлами
|
|
|
|
|
*/
|
|
|
|
|
const QDir& tempDirectory() const;
|
|
|
|
|
/**
|
|
|
|
|
* @brief Установка пути к каталогу с временными файлами
|
|
|
|
|
*/
|
|
|
|
|
void setTempDirectory( const QString& tempDirectory );
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Получение пути к домашнему каталогу текущего пользователя
|
|
|
|
|
*/
|
|
|
|
|
const QDir& homeDirectory() const;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Имя подкаталога для проекта
|
|
|
|
|
*/
|
|
|
|
|
const QString& projectDirectoryName() const;
|
|
|
|
|
/**
|
|
|
|
|
* @brief Установка имени подкаталога для проекта
|
|
|
|
|
*/
|
|
|
|
|
void setProjectDirectoryName( const QString& projectDirectoryName );
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Имя исполняемого файла
|
|
|
|
|
*/
|
2020-04-03 21:04:02 +00:00
|
|
|
|
QString executableFileName() const;
|
2020-04-01 22:29:39 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief Полный путь к исполняемому файлу
|
|
|
|
|
*/
|
|
|
|
|
const QFileInfo& executableFilePath() const;
|
2019-10-04 09:48:12 +00:00
|
|
|
|
}; // class Paths
|
2019-10-02 11:29:10 +00:00
|
|
|
|
|
|
|
|
|
} // namespace filesystem
|
|
|
|
|
|
|
|
|
|
} // namespace myx
|
|
|
|
|
|
|
|
|
|
#endif // MYX_FILESYSTEM_PATHS_HPP_
|