Потокобезопасная версия в отдельном классе и удаление лишних методов
This commit is contained in:
parent
df9b2ff599
commit
a39e514278
@ -3,25 +3,34 @@
|
||||
#include <myx/base/config.hpp>
|
||||
|
||||
#include <myx/filesystem/paths.hpp>
|
||||
#include <myx/filesystem/paths_mt.hpp>
|
||||
|
||||
#include <QCoreApplication>
|
||||
#include <QDebug>
|
||||
|
||||
namespace MF = myx::filesystem;
|
||||
|
||||
// Переменные для защиты экземпляра класса MF::Paths
|
||||
std::atomic< MF::Paths* > MF::Paths::mInstance;
|
||||
std::mutex MF::Paths::mMutex;
|
||||
// Переменные для защиты экземпляра класса MF::PathsMT
|
||||
std::atomic< MF::PathsMT* > MF::PathsMT::mInstance;
|
||||
std::mutex MF::PathsMT::mMutex;
|
||||
|
||||
int main( int argc, char** argv )
|
||||
{
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
QCoreApplication::setApplicationName( QStringLiteral( CMLIB_PROJECT_NAME ) );
|
||||
MF::Paths* paths = MF::Paths::getInstance();
|
||||
MF::PathsMT* pathsMT = MF::PathsMT::instance();
|
||||
MF::Paths* paths = MF::Paths::instance();
|
||||
|
||||
pathsMT->init( QStringLiteral( CMLIB_PROJECT_NAME ), QStringLiteral( "conf" ) );
|
||||
pathsMT->findConfigFile( QStringLiteral( "test" ) );
|
||||
qDebug() << pathsMT->systemLogDirectory();
|
||||
qDebug() << pathsMT->systemConfigDirectory();
|
||||
|
||||
paths->init( QStringLiteral( CMLIB_PROJECT_NAME ), QStringLiteral( "conf" ) );
|
||||
paths->makeDefaultDirectories();
|
||||
paths->findConfigFile( QStringLiteral( "test" ) );
|
||||
qDebug() << paths->systemConstDataDirectory();
|
||||
qDebug() << paths->configFileName();
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
@ -5,12 +5,14 @@ set(current_target filesystem)
|
||||
set(current_target_sources
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/current_executable.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/paths.cpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/paths_mt.cpp
|
||||
)
|
||||
|
||||
# Список заголовочных файлов (используется для установки)
|
||||
set(current_target_headers
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/current_executable.hpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/paths.hpp
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/paths_mt.hpp
|
||||
)
|
||||
|
||||
add_common_library(TARGET ${current_target}
|
||||
|
@ -13,23 +13,6 @@ namespace filesystem {
|
||||
|
||||
Paths::Paths() = default;
|
||||
|
||||
Paths* Paths::getInstance()
|
||||
{
|
||||
volatile Paths* localInstance = mInstance.load( std::memory_order_acquire );
|
||||
if ( localInstance == nullptr )
|
||||
{
|
||||
std::lock_guard< std::mutex > myLock( mMutex );
|
||||
localInstance = mInstance.load( std::memory_order_relaxed );
|
||||
if ( localInstance == nullptr ) // -V1036
|
||||
{
|
||||
localInstance = new Paths();
|
||||
mInstance.store( const_cast< Paths* >( localInstance ), std::memory_order_release ); // NOLINT
|
||||
}
|
||||
}
|
||||
return( const_cast< Paths* >( localInstance ) ); // NOLINT
|
||||
}
|
||||
|
||||
|
||||
Paths::HierarchyType Paths::getHierarchyType()
|
||||
{
|
||||
QRegExp binRegexp( "/s*bin$" );
|
||||
@ -143,7 +126,7 @@ bool Paths::init( const QString& projectDir, const QString& configFileExtension
|
||||
|
||||
m_homeDirectory = QString::fromLocal8Bit( qgetenv( "HOME" ) );
|
||||
m_tempDirectory = QString::fromLocal8Bit( qgetenv( "TMPDIR" ) );
|
||||
if ( m_tempDirectory.canonicalPath().isEmpty() || ( m_tempDirectory.path() == QStringLiteral( "." ) ) )
|
||||
if ( m_tempDirectory.isEmpty() || ( m_tempDirectory.path() == QStringLiteral( "." ) ) )
|
||||
{
|
||||
m_tempDirectory = QStringLiteral( _PATH_TMP );
|
||||
}
|
||||
@ -230,162 +213,84 @@ const QDir& Paths::userConfigDirectory() const
|
||||
}
|
||||
|
||||
|
||||
void Paths::setUserConfigDirectory( const QString& userConfigDirectory )
|
||||
{
|
||||
m_userConfigDirectory = userConfigDirectory;
|
||||
}
|
||||
|
||||
|
||||
const QDir& Paths::systemConfigDirectory() const
|
||||
{
|
||||
return( m_systemConfigDirectory );
|
||||
}
|
||||
|
||||
|
||||
void Paths::setSystemConfigDirectory( const QString& systemConfigDirectory )
|
||||
{
|
||||
m_systemConfigDirectory = systemConfigDirectory;
|
||||
}
|
||||
|
||||
|
||||
const QFileInfo& Paths::configFilePath() const
|
||||
{
|
||||
return( m_configFilePath );
|
||||
}
|
||||
|
||||
|
||||
void Paths::setConfigFilePath( const QFileInfo& configFilePath )
|
||||
{
|
||||
m_configFilePath = configFilePath;
|
||||
}
|
||||
|
||||
|
||||
const QString& Paths::configFileName() const
|
||||
{
|
||||
return( m_configFileName );
|
||||
}
|
||||
|
||||
|
||||
void Paths::setConfigFileName( const QString& configFileName )
|
||||
{
|
||||
m_configFileName = configFileName;
|
||||
}
|
||||
|
||||
|
||||
const QString& Paths::configFileExtension() const
|
||||
{
|
||||
return( m_configFileExtension );
|
||||
}
|
||||
|
||||
|
||||
void Paths::setConfigFileExtension( const QString& configFileExtension )
|
||||
{
|
||||
m_configFileExtension = configFileExtension;
|
||||
}
|
||||
|
||||
|
||||
const QDir& Paths::userVarDataDirectory() const
|
||||
{
|
||||
return( m_userVarDataDirectory );
|
||||
}
|
||||
|
||||
|
||||
void Paths::setUserVarDataDirectory( const QString& userVarDataDirectory )
|
||||
{
|
||||
m_userVarDataDirectory = userVarDataDirectory;
|
||||
}
|
||||
|
||||
|
||||
const QDir& Paths::systemVarDataDirectory() const
|
||||
{
|
||||
return( m_systemVarDataDirectory );
|
||||
}
|
||||
|
||||
|
||||
void Paths::setSystemVarDataDirectory( const QString& systemVarDataDirectory )
|
||||
{
|
||||
m_systemVarDataDirectory = systemVarDataDirectory;
|
||||
}
|
||||
|
||||
|
||||
const QDir& Paths::userConstDataDirectory() const
|
||||
{
|
||||
return( m_userConstDataDirectory );
|
||||
}
|
||||
|
||||
|
||||
void Paths::setUserConstDataDirectory( const QString& userConstDataDirectory )
|
||||
{
|
||||
m_userConstDataDirectory = userConstDataDirectory;
|
||||
}
|
||||
|
||||
|
||||
const QDir& Paths::systemConstDataDirectory() const
|
||||
{
|
||||
return( m_systemConstDataDirectory );
|
||||
}
|
||||
|
||||
|
||||
void Paths::setSystemConstDataDirectory( const QString& systemConstDataDirectory )
|
||||
{
|
||||
m_systemConstDataDirectory = systemConstDataDirectory;
|
||||
}
|
||||
|
||||
|
||||
const QDir& Paths::userLogDirectory() const
|
||||
{
|
||||
return( m_userLogDirectory );
|
||||
}
|
||||
|
||||
|
||||
void Paths::setUserLogDirectory( const QString& userLogDirectory )
|
||||
{
|
||||
m_userLogDirectory = userLogDirectory;
|
||||
}
|
||||
|
||||
|
||||
const QDir& Paths::systemLogDirectory() const
|
||||
{
|
||||
return( m_systemLogDirectory );
|
||||
}
|
||||
|
||||
|
||||
void Paths::setSystemLogDirectory( const QString& systemLogDirectory )
|
||||
{
|
||||
m_systemLogDirectory = systemLogDirectory;
|
||||
}
|
||||
|
||||
|
||||
const QDir& Paths::tempDirectory() const
|
||||
{
|
||||
return( m_tempDirectory );
|
||||
}
|
||||
|
||||
|
||||
void Paths::setTempDirectory( const QString& tempDirectory )
|
||||
{
|
||||
m_tempDirectory = tempDirectory;
|
||||
}
|
||||
|
||||
|
||||
const QDir& Paths::homeDirectory() const
|
||||
{
|
||||
return( m_homeDirectory );
|
||||
}
|
||||
|
||||
|
||||
const QString& Paths::projectDirectoryName() const
|
||||
const QString& Paths::projectName() const
|
||||
{
|
||||
return( m_projectName );
|
||||
}
|
||||
|
||||
|
||||
void Paths::setProjectDirectoryName( const QString& projectDirectoryName )
|
||||
{
|
||||
m_projectName = projectDirectoryName;
|
||||
}
|
||||
|
||||
|
||||
QString Paths::executableFileName() const
|
||||
{
|
||||
return( m_currentExecutable.m_canonicalFilePath.fileName() );
|
||||
|
@ -14,15 +14,11 @@
|
||||
#include <QDir>
|
||||
#include <QFileInfo>
|
||||
|
||||
#include <atomic>
|
||||
#include <future>
|
||||
#include <mutex>
|
||||
#include <thread>
|
||||
|
||||
namespace myx {
|
||||
|
||||
namespace filesystem {
|
||||
|
||||
/// @brief Класс, предоставляющий методы для получения стандартных путей к каталогам и файлам
|
||||
class Paths
|
||||
{
|
||||
enum class HierarchyType : intptr_t
|
||||
@ -76,22 +72,25 @@ class Paths
|
||||
/// @brief Расширение для файла настройки
|
||||
QString m_configFileExtension;
|
||||
|
||||
HierarchyType getHierarchyType();
|
||||
|
||||
protected:
|
||||
Paths();
|
||||
~Paths() = default;
|
||||
Paths( const Paths& ) = delete;
|
||||
Paths& operator=( const Paths& ) = delete;
|
||||
|
||||
HierarchyType getHierarchyType();
|
||||
|
||||
static std::atomic< Paths* > mInstance;
|
||||
static std::mutex mMutex;
|
||||
|
||||
public:
|
||||
/**
|
||||
* @brief getInstance
|
||||
* @return Уникальный экземпляр класса Paths
|
||||
*/
|
||||
static Paths* getInstance();
|
||||
static Paths* instance()
|
||||
{
|
||||
static Paths p;
|
||||
return( &p );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Обновление путей с учётом расположения исполняемого файла
|
||||
@ -137,28 +136,16 @@ public:
|
||||
* @brief Полный путь к файлу настройки
|
||||
*/
|
||||
const QFileInfo& configFilePath() const;
|
||||
/**
|
||||
* @brief Установка полного пути к файлу настройки
|
||||
*/
|
||||
void setConfigFilePath( const QFileInfo& configFilePath );
|
||||
|
||||
/**
|
||||
* @brief Имя файла настройки
|
||||
*/
|
||||
const QString& configFileName() const;
|
||||
/**
|
||||
* @brief Установка имени файла настройки
|
||||
*/
|
||||
void setConfigFileName( const QString& configFileName );
|
||||
|
||||
/**
|
||||
* @brief Расширение у файла настройки
|
||||
*/
|
||||
const QString& configFileExtension() const;
|
||||
/**
|
||||
* @brief Установка расширения у файла настройки
|
||||
*/
|
||||
void setConfigFileExtension( const QString& configFileExtension );
|
||||
|
||||
/**
|
||||
* @brief Получение пути к пользовательскому каталогу с изменяемыми файлами
|
||||
@ -203,7 +190,7 @@ public:
|
||||
/**
|
||||
* @brief Имя подкаталога для проекта
|
||||
*/
|
||||
const QString& projectDirectoryName() const;
|
||||
const QString& projectName() const;
|
||||
|
||||
/**
|
||||
* @brief Имя исполняемого файла
|
||||
@ -214,67 +201,6 @@ public:
|
||||
* @brief Полный путь к исполняемому файлу
|
||||
*/
|
||||
const QFileInfo& executableFilePath() const;
|
||||
|
||||
private:
|
||||
/**
|
||||
* @brief Установка пути к базовому каталогу
|
||||
*/
|
||||
void setPrefixDirectory( const QString& prefixDirectory );
|
||||
|
||||
/**
|
||||
* @brief Установка пути к каталогу с исполняемым файлом
|
||||
*/
|
||||
void setBinaryDirectory( const QString& binaryDirectory );
|
||||
|
||||
/**
|
||||
* @brief Установка пути к пользовательскому каталогу с файлами настройки
|
||||
*/
|
||||
void setUserConfigDirectory( const QString& userConfigDirectory );
|
||||
|
||||
/**
|
||||
* @brief Установка пути к системному каталогу с файлами настройки
|
||||
*/
|
||||
void setSystemConfigDirectory( const QString& systemConfigDirectory );
|
||||
|
||||
/**
|
||||
* @brief Установка пути к пользовательскому каталогу с изменяемыми файлами
|
||||
*/
|
||||
void setUserVarDataDirectory( const QString& userVarDataDirectory );
|
||||
|
||||
/**
|
||||
* @brief Установка пути к системному каталогу с изменяемыми файлами
|
||||
*/
|
||||
void setSystemVarDataDirectory( const QString& systemVarDataDirectory );
|
||||
|
||||
/**
|
||||
* @brief Установка пути к пользовательскому каталогу с неизменяемыми файлами
|
||||
*/
|
||||
void setUserConstDataDirectory( const QString& userConstDataDirectory );
|
||||
|
||||
/**
|
||||
* @brief Установка пути к системному каталогу с неизменяемыми файлами
|
||||
*/
|
||||
void setSystemConstDataDirectory( const QString& systemConstDataDirectory );
|
||||
|
||||
/**
|
||||
* @brief Установка пути к пользовательскому каталогу с журналами работы
|
||||
*/
|
||||
void setUserLogDirectory( const QString& userLogDirectory );
|
||||
|
||||
/**
|
||||
* @brief Установка пути к системному каталогу с журналами работы
|
||||
*/
|
||||
void setSystemLogDirectory( const QString& systemLogDirectory );
|
||||
|
||||
/**
|
||||
* @brief Установка пути к каталогу с временными файлами
|
||||
*/
|
||||
void setTempDirectory( const QString& tempDirectory );
|
||||
|
||||
/**
|
||||
* @brief Установка имени подкаталога для проекта
|
||||
*/
|
||||
void setProjectDirectoryName( const QString& projectDirectoryName );
|
||||
}; // class Paths
|
||||
|
||||
} // namespace filesystem
|
||||
|
Loading…
x
Reference in New Issue
Block a user