一、核心思想
在程序运行结束前,创建一个删除脚本,删除程序本身,最后在删除脚本自己。
二、代码实现
2.1 源代码
#include <windows.h>
void CreateAndRunSelfDeleteDirScript(const std::wstring& dirPath) {
// 构造bat脚本路径
std::wstring batPath = dirPath + L"\\_deldir.bat";
FILE* fp = _wfopen(batPath.c_str(), L"w, ccs=UTF-8");
if (fp) {
fwprintf(fp, L"@echo off\n");
// 延迟2秒左右
fwprintf(fp, L"timeout /t 2 /nobreak >nul\n");
// 跳转到临时目录,避免锁定目标目录
fwprintf(fp, L"cd /d %%TEMP%%\n");
// 递归删除目标目录
fwprintf(fp, L"rd /s /q \"%%~1\"\n");
// 删除自身脚本
fwprintf(fp, L"del \"%%~f0\" >nul 2>nul\n");
fclose(fp);
// 包围参数,避免路径中存在空格导致删除失败
std::wstring params = L"\"" + dirPath + L"\"";
// 启动bat脚本
ShellExecuteW(NULL, L"open", batPath.c_str(), params.c_str(), NULL, SW_HIDE);
}
}
2.2 调用方式
#include <string>
int main(void) {
std::wstring path = L"D:\yyh"; // 要删除的目录(自毁卸载的话,就是卸载器所在的目录)
CreateAndRunSelfDeleteDirScript(path);
return 0;
}
三、补充
- 支持中文路径、英文路径、中英混合路径
- 支持路径中带有 %
- 支持路径中带有 空格
- 在高权限目录需要管理员权限,所以可能会失败
- 如果没有数字签名,可能会被部分杀毒软件视为危险