GrabBag/AppUtils/AppCommon/Src/PathManager.cpp

101 lines
2.8 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.

#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);
}