清除VC和WDK的编译产生的垃圾

#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;
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值