Files
kortapp-z/tools/system_cleaner.cpp
2025-06-22 09:39:58 +08:00

97 lines
2.9 KiB
C++

#include <iostream>
#include <filesystem>
#include <chrono>
#include <vector>
#include <windows.h>
namespace fs = std::filesystem;
bool IsAdmin() {
BOOL isAdmin = FALSE;
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
PSID AdminGroup;
if (AllocateAndInitializeSid(&NtAuthority, 2,
SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0, &AdminGroup)) {
if (!CheckTokenMembership(NULL, AdminGroup, &isAdmin)) {
isAdmin = FALSE;
}
FreeSid(AdminGroup);
}
return isAdmin == TRUE;
}
void CleanDirectory(const fs::path& dir, size_t& deletedCount, size_t& errorCount) {
if (!fs::exists(dir)) {
std::cout << "目录不存在: " << dir << std::endl;
return;
}
for (const auto& entry : fs::directory_iterator(dir)) {
try {
if (fs::is_regular_file(entry)) {
fs::remove(entry);
deletedCount++;
}
} catch (const std::exception& e) {
std::cerr << "删除文件失败: " << entry.path() << " - " << e.what() << std::endl;
errorCount++;
}
}
}
int main() {
try {
if (!IsAdmin()) {
std::cerr << "请以管理员身份运行此程序以清理所有目录" << std::endl;
}
auto start = std::chrono::high_resolution_clock::now();
size_t totalDeleted = 0;
size_t totalErrors = 0;
// 定义要清理的目录列表
std::vector<fs::path> directories = {
"C:\\Windows\\Temp",
fs::path(std::getenv("USERPROFILE")) / "AppData" / "Local" / "Temp",
"C:\\Windows\\SoftwareDistribution\\Download",
"C:\\Windows\\Logs",
"C:\\Windows\\Minidump"
};
// 只有管理员才能清理Prefetch目录
if (IsAdmin()) {
directories.push_back("C:\\Windows\\Prefetch");
}
// 清理每个目录
for (const auto& dir : directories) {
size_t dirDeleted = 0;
size_t dirErrors = 0;
std::cout << "正在清理: " << dir << std::endl;
CleanDirectory(dir, dirDeleted, dirErrors);
totalDeleted += dirDeleted;
totalErrors += dirErrors;
std::cout << "已删除 " << dirDeleted << " 个文件" << std::endl;
}
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
std::cout << "\n清理完成:" << std::endl;
std::cout << "总共删除文件数: " << totalDeleted << std::endl;
std::cout << "总共错误数: " << totalErrors << std::endl;
std::cout << "耗时: " << duration.count() << " 毫秒" << std::endl;
} catch (const std::exception& e) {
std::cerr << "发生错误: " << e.what() << std::endl;
return 1;
}
return 0;
}