From 52d9a77886127cd76c46ac84df0eb532b04f665a Mon Sep 17 00:00:00 2001 From: re2zero Date: Tue, 10 Feb 2026 10:14:19 +0800 Subject: [PATCH] fix(watch): fix path format and add watch for newly created directories MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ensure directories exist before adding watches and fix path format consistency to match getDesktopFileDirs(). Dynamically add watch for newly created application directories. 修复目录路径格式问题,并在添加监听前确保目录存在。为动态创建的应用目录添加监听。 Log: 修复目录监听问题 PMS: BUG-340395 Influence: 修复了路径格式不一致导致的目录监听失败问题,确保新创建的应用目录能被正确监听,避免应用更新后无法及时刷新。 --- src/dbus/applicationmanager1service.cpp | 29 +++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/dbus/applicationmanager1service.cpp b/src/dbus/applicationmanager1service.cpp index 8f3bd8c0..9b3f6fd4 100644 --- a/src/dbus/applicationmanager1service.cpp +++ b/src/dbus/applicationmanager1service.cpp @@ -87,7 +87,19 @@ void ApplicationManager1Service::initService(QDBusConnection &connection) noexce } connect(&m_watcher, &QFileSystemWatcher::directoryChanged, this, &ApplicationManager1Service::ReloadApplications); - auto unhandled = m_watcher.addPaths(getDesktopFileDirs()); + + // Ensure all directories exist before adding watches + auto desktopDirs = getDesktopFileDirs(); + for (const auto &dirPath : std::as_const(desktopDirs)) { + QDir dir(dirPath); + if (!dir.exists()) { + if (!dir.mkpath(dirPath)) { + qWarning() << "Failed to create directory:" << dirPath; + } + } + } + + auto unhandled = m_watcher.addPaths(desktopDirs); for (const auto &dir : std::as_const(unhandled)) { qCritical() << "couldn't watch directory:" << dir; } @@ -682,12 +694,25 @@ QString ApplicationManager1Service::addUserApplication(const QVariantMap &deskto } QDir xdgDataHome; - QString dir{getXDGDataHome() + "/applications"}; + QString dir{getXDGDataHome()}; + // Ensure consistent path format (with trailing separator) to match getDesktopFileDirs() + if (!dir.endsWith(QDir::separator())) { + dir.append(QDir::separator()); + } + dir.append("applications"); + const bool dirExisted = QDir(dir).exists(); if (!xdgDataHome.mkpath(dir)) { safe_sendErrorReply(QDBusError::Failed, "couldn't create directory of user applications."); return {}; } + // If directory is newly created, add watch for it dynamically + if (!dirExisted && !m_watcher.directories().contains(dir)) { + if (!m_watcher.addPath(dir)) { + qWarning() << "Failed to add watch for newly created directory:" << dir; + } + } + // 判断当前是否已经存在了desktop文件 xdgDataHome.setPath(dir); const auto &filePath = xdgDataHome.filePath(name);