#include "PathManager.h" #include #include #include #include #include #include #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 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); }