GrabBag/AppUtils/AppCommon/Src/PathManager.cpp

101 lines
2.8 KiB
C++
Raw Normal View History

#include "PathManager.h"
#include <QtCore/QCoreApplication>
#include <QtCore/QFileInfo>
#include <QtCore/QDir>
#include <QtCore/QStandardPaths>
#include <QtCore/QFile>
#include <stdexcept>
#include "VrLog.h"
// 静态成员初始化
PathManager* PathManager::s_instance = nullptr;
std::mutex PathManager::s_mutex;
PathManager::PathManager(const QString& appName)
: m_appName(appName)
{
// 初始化时计算并缓存所有路径
m_configDirectory = GetConfigDirectory();
EnsureConfigDirectoryExists();
m_configFilePath = m_configDirectory + "/config.xml";
m_calibrationFilePath = m_configDirectory + "/EyeHandCalibMatrixInfo.ini";
LOG_INFO("PathManager initialized for app: %s\n", appName.toStdString().c_str());
LOG_INFO("Config directory: %s\n", m_configDirectory.toStdString().c_str());
}
PathManager& PathManager::GetInstance()
{
std::lock_guard<std::mutex> lock(s_mutex);
if (s_instance == nullptr) {
// 自动从应用程序路径获取应用名称
QString appFilePath = QCoreApplication::applicationFilePath();
QString appName = QFileInfo(appFilePath).baseName();
LOG_INFO("Auto-detected application name: %s\n", appName.toStdString().c_str());
s_instance = new PathManager(appName);
}
return *s_instance;
}
QString PathManager::GetConfigFilePath() const
{
return m_configFilePath;
}
QString PathManager::GetCalibrationFilePath() const
{
return m_calibrationFilePath;
}
QString PathManager::GetAppConfigDirectory() const
{
return m_configDirectory;
}
QString PathManager::GetConfigDirectory() const
{
QString baseDir;
#ifdef _WIN32
// Windows系统使用程序目录
baseDir = GetProgramDirectory();
#else
// Linux系统使用用户配置目录
baseDir = GetUserConfigDirectory();
#endif
// 使用类成员变量中存储的应用名称,避免重复获取
return baseDir + "/../" + m_appName + "/Config";
}
bool PathManager::EnsureConfigDirectoryExists()
{
if (QDir().exists(m_configDirectory)) {
return true;
}
LOG_INFO("Creating configuration directory: %s\n", m_configDirectory.toStdString().c_str());
bool success = QDir().mkpath(m_configDirectory);
if (success) {
LOG_INFO("Configuration directory created successfully\n");
} else {
LOG_ERROR("Failed to create configuration directory: %s\n", m_configDirectory.toStdString().c_str());
}
return success;
}
QString PathManager::GetProgramDirectory() const
{
QString exePath = QCoreApplication::applicationFilePath();
return QFileInfo(exePath).absoluteDir().path();
}
QString PathManager::GetUserConfigDirectory() const
{
return QStandardPaths::writableLocation(QStandardPaths::ConfigLocation);
}