From 71fd4f8a86c2ed4425949b079d18d6e75a2f5b0c Mon Sep 17 00:00:00 2001 From: impressionyang Date: Fri, 12 Jun 2026 14:46:50 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=B8=85=E7=90=86=20=E2=80=94=20=E6=97=A5=E5=BF=97=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=94=B9=E4=B8=BA=E6=B8=85=E7=A9=BA=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E8=80=8C=E9=9D=9E=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 清除日志:使用 QIODevice::Truncate 清空文件内容, 保留文件避免 Logger 已打开的句柄指向已删除 inode - 清除录音:保持删除模式(.wav 调试文件无活跃句柄) Co-Authored-By: Claude Opus 4.7 --- src/ui/settings_page.cpp | 48 ++++++++++++++++++++-------------------- src/ui/settings_page.h | 6 ++++- 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/ui/settings_page.cpp b/src/ui/settings_page.cpp index 6d003ac..4fc3ea8 100644 --- a/src/ui/settings_page.cpp +++ b/src/ui/settings_page.cpp @@ -411,18 +411,13 @@ void SettingsPage::onResetConfig() { } void SettingsPage::onClearLogs() { + // 使用与 Logger 相同的路径逻辑 QString logDir = configManager_->get("app.log_dir").toString(); if (logDir.isEmpty()) { logDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); } - QDir dir(logDir); - if (!dir.exists()) { - QMessageBox::information(this, "清除日志", "日志目录不存在:" + logDir); - return; - } - - auto result = clearDirectoryFiles(logDir, {"*.log"}, "日志文件"); + auto result = clearDirectoryFiles(logDir, {"*.log"}, "日志文件", TruncateMode); if (result.deletedCount < 0) { QMessageBox::warning(this, "清除日志", "清除失败,请检查目录权限"); return; @@ -432,9 +427,9 @@ void SettingsPage::onClearLogs() { return; } QMessageBox::information(this, "清除日志", - QString("已清除 %1 个日志文件,释放 %2 KB 空间") + QString("已清空 %1 个日志文件的内容,释放 %2 KB 空间") .arg(result.deletedCount).arg(result.freedBytes / 1024)); - statusLabel_->setText("日志文件已清除"); + statusLabel_->setText("日志文件已清空"); } void SettingsPage::onClearAudioFiles() { @@ -443,13 +438,7 @@ void SettingsPage::onClearAudioFiles() { audioDir = QDir::tempPath() + "/impress_audio_debug"; } - QDir dir(audioDir); - if (!dir.exists()) { - QMessageBox::information(this, "清除录音", "录音文件目录不存在:" + audioDir); - return; - } - - auto result = clearDirectoryFiles(audioDir, {"*.wav"}, "录音文件"); + auto result = clearDirectoryFiles(audioDir, {"*.wav"}, "录音文件", DeleteMode); if (result.deletedCount < 0) { QMessageBox::warning(this, "清除录音", "清除失败,请检查目录权限"); return; @@ -459,13 +448,14 @@ void SettingsPage::onClearAudioFiles() { return; } QMessageBox::information(this, "清除录音", - QString("已清除 %1 个录音文件,释放 %2 KB 空间") + QString("已删除 %1 个录音文件,释放 %2 KB 空间") .arg(result.deletedCount).arg(result.freedBytes / 1024)); statusLabel_->setText("录音文件已清除"); } SettingsPage::CleanupResult SettingsPage::clearDirectoryFiles( - const QString& dirPath, const QStringList& filters, const QString& desc) { + const QString& dirPath, const QStringList& filters, const QString& desc, + ClearMode mode) { QDir dir(dirPath); if (!dir.exists()) return {-1, 0}; @@ -473,19 +463,29 @@ SettingsPage::CleanupResult SettingsPage::clearDirectoryFiles( if (files.isEmpty()) return {0, 0}; qint64 totalSize = 0; - int deletedCount = 0; + int processedCount = 0; for (const auto& fi : files) { totalSize += fi.size(); - if (dir.remove(fi.fileName())) { - deletedCount++; + bool ok = false; + if (mode == TruncateMode) { + // 清空文件内容,保留文件(避免 logger 句柄失效) + QFile f(fi.absoluteFilePath()); + ok = f.open(QIODevice::WriteOnly | QIODevice::Truncate); + if (ok) f.close(); + } else { + // 删除文件 + ok = dir.remove(fi.fileName()); + } + if (ok) { + processedCount++; } } - LOG_INFO(kTag, QString("已清除 %1/%2 个%3,释放 %4 KB") - .arg(deletedCount).arg(files.size()).arg(desc).arg(totalSize / 1024)); + LOG_INFO(kTag, QString("已清理 %1/%2 个%3,释放 %4 KB") + .arg(processedCount).arg(files.size()).arg(desc).arg(totalSize / 1024)); - return {deletedCount, totalSize}; + return {processedCount, totalSize}; } } // namespace impress diff --git a/src/ui/settings_page.h b/src/ui/settings_page.h index abd1827..d290538 100644 --- a/src/ui/settings_page.h +++ b/src/ui/settings_page.h @@ -1,6 +1,7 @@ #pragma once #include +#include class QFormLayout; class QLineEdit; @@ -39,6 +40,8 @@ private slots: void onClearAudioFiles(); private: + enum ClearMode { TruncateMode, DeleteMode }; + struct CleanupResult { int deletedCount; qint64 freedBytes; @@ -50,7 +53,8 @@ private: void populateAudioDevices(); void selectAudioDevice(int deviceIndex); int getSelectedAudioDeviceIndex() const; - CleanupResult clearDirectoryFiles(const QString& dirPath, const QStringList& filters, const QString& desc); + CleanupResult clearDirectoryFiles(const QString& dirPath, const QStringList& filters, + const QString& desc, ClearMode mode); ConfigManager* configManager_;