Visual Studio 历史记录一键清理(C语言版)

Visual Studio 历史记录清理方法来自 https://developer.aliyun.com/article/1334856

原文中关于使用批处理来一键清理的代码已经写出,但咱就是爱折腾,以下为C语言代码实现(考虑现在都VS2026了,旧版清理注册表的方式就忽略了,仅删除ApplicationPrivateSettings.xml):

点击查看代码
#include <Windows.h>
#include <ShlObj.h> // SHFileOperation需要它

int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow)
{
    // 使用Windows API展开%localappdata%\\Microsoft\\VisualStudio
    // 定义一个缓冲区,用于存储展开后的路径
    TCHAR szPath[MAX_PATH];
    ExpandEnvironmentStrings(L"%localappdata%\\Microsoft\\VisualStudio", szPath, MAX_PATH);

    // 搜索szPath目录及其子目录下的ApplicationPrivateSettings.xml文件
    // 如果找到了,就删除至回收站
    // 如果找不到,就弹出一个消息框

    // 定义一个缓冲区,用于存储搜索路径
    TCHAR searchPath[MAX_PATH];
    wsprintf(searchPath, L"%s\\*.*", szPath);

    WIN32_FIND_DATA findData;
    HANDLE hFind = FindFirstFile(searchPath, &findData);

    if (hFind == INVALID_HANDLE_VALUE)
    {
        // 如果搜索失败,使用Windows API函数MessageBox()弹出一个消息框
        MessageBox(NULL, L"未找到ApplicationPrivateSettings.xml文件", L"CleanVSrecent", MB_OK);
    }
    else
    {
        BOOL found = FALSE;
        do
        {
            if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
                // 忽略"."和".."目录
                if (lstrcmp(findData.cFileName, L".") != 0 && lstrcmp(findData.cFileName, L"..") != 0)
                {
                    // 递归搜索子目录
                    TCHAR subDirPath[MAX_PATH];
                    wsprintf(subDirPath, L"%s\\%s", szPath, findData.cFileName);
                    TCHAR subSearchPath[MAX_PATH];
                    wsprintf(subSearchPath, L"%s\\ApplicationPrivateSettings.xml", subDirPath);

                    WIN32_FIND_DATA subFindData;
                    HANDLE hSubFind = FindFirstFile(subSearchPath, &subFindData);
                    if (hSubFind != INVALID_HANDLE_VALUE)
                    {
                        found = TRUE;
                        FindClose(hSubFind);

                        // 打印找到的文件路径
                        //MessageBox(NULL, subSearchPath, L"CleanVSrecent", MB_OK);

						// 在路径后面加上一个空字符,以便SHFileOperation()函数识别路径结束
                        subSearchPath[lstrlen(subSearchPath) + 1] = '\0';

                        // 删除文件至回收站
                        SHFILEOPSTRUCT fileOp;
                        ZeroMemory(&fileOp, sizeof(SHFILEOPSTRUCT));
                        fileOp.wFunc = FO_DELETE;
                        fileOp.pFrom = subSearchPath;
                        fileOp.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION;
                        int result = SHFileOperation(&fileOp);
                        if (result != 0)
                        {
                            MessageBox(NULL, L"删除ApplicationPrivateSettings.xml文件失败", L"CleanVSrecent", MB_OK | MB_SYSTEMMODAL);
                        }
                        else
                        {
                            MessageBox(NULL, L"找到并删除ApplicationPrivateSettings.xml文件", L"CleanVSrecent", MB_OK | MB_SYSTEMMODAL);
                        }
                        break;
                    }
                }
            }
        } while (FindNextFile(hFind, &findData));

        if (!found)
        {
            MessageBox(NULL, L"未找到ApplicationPrivateSettings.xml文件", L"CleanVSrecent", MB_OK | MB_SYSTEMMODAL);
        }

        FindClose(hFind);
    }

    // 返回0表示程序正常退出
    return 0;
}

点此下载已经编译好的程序

posted @ 2025-12-01 18:47  HELLO-X  阅读(10)  评论(0)    收藏  举报