清除VC和WDK的編譯產生的垃圾

來源:互聯網
上載者:User

#include <windows.h>
#include <tchar.h>
#include <Shlwapi.h>
#pragma comment(lib,"Shlwapi.lib")

TCHAR* szSuffix[] = {TEXT(".suo"),TEXT(".ncb"),TEXT(".user"),TEXT(".pdb"),TEXT(".obj"),TEXT("Readme.txt"),TEXT("ReadMe.txt"),TEXT(".aps"),TEXT(".idb"),
TEXT(".ilk"),TEXT(".plg"),TEXT(".opt"),TEXT(".sbr"),TEXT(".pch"),TEXT(".sdf"),TEXT(".netmodule"),TEXT(".db"),TEXT(".bsc"),TEXT(".old"),TEXT("PREfast"),
TEXT("buildchk"),TEXT("BuildLog"),TEXT("buildfre"),TEXT("prefast")};

TCHAR* szDir[] = {TEXT("\\.svn"),TEXT("\\debug"),TEXT("\\Debug"),TEXT("\\Release"),TEXT("\\release"),TEXT("\\ipch"),TEXT("\\Bin"),TEXT("\\Obj"),
TEXT("objchk"),TEXT("objfre")};

TCHAR szLongPath [MAX_PATH] = TEXT("");//本程式所在檔案夾路徑
TCHAR szLongFile [MAX_PATH] = TEXT("");//本程式自身路徑

//判斷是不是可以刪除的尾碼名
BOOL CheckSuffix(LPCTSTR lpFilePath)
{
    LPCTSTR tmp = NULL;
    int i;
    for(i = 0; i < ( sizeof( szSuffix ) / sizeof( TCHAR* ) ); i++ )
    {
        tmp = _tcsstr(lpFilePath,szSuffix[i]);
        if (tmp != NULL)
        {
            return TRUE;
        }
    }
    return FALSE;

}

//判斷是不是可以刪除的檔案夾
//從後面開始判斷
BOOL CheckDiretory(LPCTSTR lpDirPath)
{
    LPCTSTR tmp = NULL;
    int i;
    for( i = 0; i < ( sizeof( szDir ) / sizeof( TCHAR* ) ); i++ )
    {
        tmp = _tcsstr(lpDirPath,szDir[i]);
        if (tmp != NULL)
        {
            return TRUE;
        }
    }
    return FALSE;
}

//刪除檔案夾和檔案
BOOL DelFileToRecycle(LPCTSTR lpSourceFile)
{
    SHFILEOPSTRUCT shFile;
    TCHAR FilepathName[MAX_PATH];
    int len = 0;
    _stprintf_s(FilepathName,MAX_PATH,TEXT("%s"),lpSourceFile);

    len = lstrlen(FilepathName);  
    FilepathName[len] = '\0';  
    FilepathName[len+1] = '\0';

    ZeroMemory(&shFile,sizeof(shFile));
    shFile.pFrom = FilepathName;
    shFile.wFunc = FO_DELETE;
    //靜默,保留撤銷(資源回收筒),取消警告
    shFile.fFlags =FOF_SILENT|FOF_ALLOWUNDO|FOF_NOCONFIRMATION;
    if (SHFileOperation(&shFile) != 0 )   
    {
        return FALSE;   
    }
    return TRUE;
}

//擷取本清理程式所在的路徑
void GetSelfPath()
{
    TCHAR szbufPath [MAX_PATH] = TEXT("");
    LPCTSTR lpTemp = NULL;
    GetModuleFileName(NULL,szbufPath,MAX_PATH);
    GetLongPathName(szbufPath,szLongPath,MAX_PATH);
    GetLongPathName(szbufPath,szLongFile,MAX_PATH);
    lpTemp = _tcsrchr(szLongPath,'\\');
    *_tcsstr(szLongPath,lpTemp) = 0;
}

//搜尋並且刪除垃圾檔案
void SearchAndDelete(LPTSTR lpCurrentDir)
{   
    WIN32_FIND_DATA FindFileData;
    HANDLE hListFile;
    TCHAR szFullPath[MAX_PATH] = TEXT("");
    TCHAR szFilePath[MAX_PATH] = TEXT("");
    BOOL bIsRootPath = FALSE;

    lstrcpy(szFilePath, lpCurrentDir);
    lstrcat(szFilePath, TEXT("\\*"));

    hListFile = FindFirstFile(szFilePath,&FindFileData);
    if(hListFile != INVALID_HANDLE_VALUE)
    {
        do
        {
            if(lstrcmp(FindFileData.cFileName,TEXT(".")) == 0||lstrcmp(FindFileData.cFileName,TEXT("..")) == 0)
            {
                continue;
            }

            bIsRootPath = PathIsRoot(lpCurrentDir);
            if (TRUE == bIsRootPath)
            {
                _stprintf_s(szFullPath,MAX_PATH,TEXT("%s%s"),lpCurrentDir,FindFileData.cFileName);
            }
            else
            {
                _stprintf_s(szFullPath,MAX_PATH,TEXT("%s\\%s"),lpCurrentDir,FindFileData.cFileName);
            }

            if(FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
            {
                if (CheckDiretory(szFullPath))
                {
                    DelFileToRecycle(szFullPath);
                }
                SearchAndDelete(szFullPath);
            }
            else
            {
                //這裡刪除檔案
                if (lstrcmp(szLongFile,szFullPath) != 0)//自身跳過
                {
                    if (CheckSuffix(szFullPath))
                    {
                        DelFileToRecycle(szFullPath);
                    }
                }
            }
        }
        while(FindNextFile(hListFile, &FindFileData));   
    }
    FindClose(hListFile);
}

int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{
    GetSelfPath();
    SearchAndDelete(szLongPath);
    return 0;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.