// ClearDebug.h : PROJECT_NAME 应用程序的主头文件//#pragma once#ifndef __AFXWIN_H__#error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"#endif#include "resource.h" // 主符号// CClearDebugApp:// 有关此类的实现,请参阅 ClearDebug.cpp//class CClearDebugApp : public CWinApp{public:CClearDebugApp();// 重写public:virtual BOOL InitInstance();// 实现DECLARE_MESSAGE_MAP()};extern CClearDebugApp theApp;
// ClearDebug.cpp : 定义应用程序的类行为。//#include "stdafx.h"#include "ClearDebug.h"#include "ClearDebugDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// CClearDebugAppBEGIN_MESSAGE_MAP(CClearDebugApp, CWinApp)ON_COMMAND(ID_HELP, &CWinApp::OnHelp)END_MESSAGE_MAP()// CClearDebugApp 构造CClearDebugApp::CClearDebugApp(){// 支持重新启动管理器m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;// TODO: 在此处添加构造代码,// 将所有重要的初始化放置在 InitInstance 中}// 唯一的一个 CClearDebugApp 对象CClearDebugApp theApp;// CClearDebugApp 初始化BOOL CClearDebugApp::InitInstance(){// 如果一个运行在 Windows XP 上的应用程序清单指定要// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,//则需要 InitCommonControlsEx()。否则,将无法创建窗口。INITCOMMONCONTROLSEX InitCtrls;InitCtrls.dwSize = sizeof(InitCtrls);// 将它设置为包括所有要在应用程序中使用的// 公共控件类。InitCtrls.dwICC = ICC_WIN95_CLASSES;InitCommonControlsEx(&InitCtrls);CWinApp::InitInstance();AfxEnableControlContainer();// 创建 shell 管理器,以防对话框包含// 任何 shell 树视图控件或 shell 列表视图控件。CShellManager *pShellManager = new CShellManager;// 激活“Windows Native”视觉管理器,以便在 MFC 控件中启用主题CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));// 标准初始化// 如果未使用这些功能并希望减小// 最终可执行文件的大小,则应移除下列// 不需要的特定初始化例程// 更改用于存储设置的注册表项// TODO: 应适当修改该字符串,// 例如修改为公司或组织名SetRegistryKey(_T("应用程序向导生成的本地应用程序"));CClearDebugDlg dlg;m_pMainWnd = &dlg;INT_PTR nResponse = dlg.DoModal();if (nResponse == IDOK){// TODO: 在此放置处理何时用// “确定”来关闭对话框的代码}else if (nResponse == IDCANCEL){// TODO: 在此放置处理何时用// “取消”来关闭对话框的代码}else if (nResponse == -1){TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n");TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");}// 删除上面创建的 shell 管理器。if (pShellManager != NULL){delete pShellManager;}// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,// 而不是启动应用程序的消息泵。return FALSE;}
// ClearDebugDlg.h : 头文件//#pragma once#include <strsafe.h>#include <vector>#include <shellapi.h>#include "afxwin.h"#include "afxcmn.h"using std::vector;// CClearDebugDlg 对话框class CClearDebugDlg : public CDialogEx{// 构造public:CClearDebugDlg(CWnd* pParent = NULL); // 标准构造函数// 对话框数据enum { IDD = IDD_CLEARDEBUG_DIALOG };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持public://选择要删除的文件夹BOOL SelectFloder(HWND ,LPWSTR );// 实现protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()public:vector<CString>m_vecPathList;//project directoryvector<CString>m_vecStrFile;//全路径vector<CString>m_vecDebugFile;//全路径vector<CString>m_vecIpchFile;//全路径vector<CString>m_vecListBox;//全路径afx_msg void OnBnClickedButton2();CString m_strPath;afx_msg void OnEnChangeEdit1();afx_msg void OnBnClickedButton1();WCHAR StrFileaddr[MAX_PATH];BOOL DeleteTheItem2( vector<CString>File);BOOL DeleteTheItem1( vector<CString>File);LPWSTR PathTheDelObj(WIN32_FIND_DATA,LPWSTR);BOOL CleartheProject(vector<CString>PathList);void DeleteDir(CString);BOOL WirtePathToReg();//将路径写入注册表 下一次启动的时候直接读取注册表,直接清理就可以BOOL FindPath();void DeleteReg();void ToScreen();void DeleteListBox();public:HKEY m_key;afx_msg void OnLbnSelchangeList1();CListBox m_listbox;CProgressCtrl m_ProCtrl;afx_msg void OnDropFiles(HDROP hDropInfo);};
// ClearDebugDlg.cpp : 实现文件//#include "stdafx.h"#include "ClearDebug.h"#include "ClearDebugDlg.h"#include "afxdialogex.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogEx{public:CAboutDlg();// 对话框数据enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)END_MESSAGE_MAP()// CClearDebugDlg 对话框CClearDebugDlg::CClearDebugDlg(CWnd* pParent /*=NULL*/): CDialogEx(CClearDebugDlg::IDD, pParent), m_strPath(_T("")){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CClearDebugDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT1, m_strPath);DDX_Control(pDX, IDC_LIST1, m_listbox);}BEGIN_MESSAGE_MAP(CClearDebugDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON2, &CClearDebugDlg::OnBnClickedButton2)ON_EN_CHANGE(IDC_EDIT1, &CClearDebugDlg::OnEnChangeEdit1)ON_BN_CLICKED(IDC_BUTTON1, &CClearDebugDlg::OnBnClickedButton1)ON_LBN_SELCHANGE(IDC_LIST1, &CClearDebugDlg::OnLbnSelchangeList1)ON_WM_DROPFILES()END_MESSAGE_MAP()// CClearDebugDlg 消息处理程序BOOL CClearDebugDlg::OnInitDialog(){CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动// 执行此操作SetIcon(m_hIcon, TRUE); // 设置大图标SetIcon(m_hIcon, FALSE); // 设置小图标// TODO: 在此添加额外的初始化代码return TRUE; // 除非将焦点设置到控件,否则返回 TRUE}void CClearDebugDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}}// 如果向对话框添加最小化按钮,则需要下面的代码// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,// 这将由框架自动完成。void CClearDebugDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}}//当用户拖动最小化窗口时系统调用此函数取得光标//显示。HCURSOR CClearDebugDlg::OnQueryDragIcon(){return static_cast<HCURSOR>(m_hIcon);}void CClearDebugDlg::OnBnClickedButton2(){//获取窗口指针DeleteReg();HWND hwnd=AfxGetApp()->m_pMainWnd->m_hWnd;WCHAR szPath[MAX_PATH];SelectFloder(hwnd,szPath);m_strPath=szPath;HWND hedit;hedit =::GetDlgItem(hwnd,IDC_EDIT1);UpdateData(FALSE);// TODO: 在此添加控件通知处理程序代码}//选择project路径BOOL CClearDebugDlg::SelectFloder(HWND hWnd ,LPWSTR lpszFloder ){BROWSEINFO bi={0};ITEMIDLIST *pidl;TCHAR szPath[MAX_PATH];bi.hwndOwner=hWnd;bi.pszDisplayName=szPath;bi.lpszTitle=L"please select a dir!";bi.ulFlags=BIF_RETURNONLYFSDIRS;if(pidl=SHBrowseForFolder(&bi)){SHGetPathFromIDList(pidl,lpszFloder);return TRUE;}return FALSE;}void CClearDebugDlg::OnEnChangeEdit1(){}void CClearDebugDlg::OnBnClickedButton1()//清理按钮{ FindPath(); WirtePathToReg();m_vecStrFile.clear();m_vecDebugFile.clear();m_vecIpchFile.clear();// for(int a=m_listbox.GetCount();a>=0;a--)// m_listbox.DeleteString(a);WCHAR szFilePath[MAX_PATH];StringCbCopy(szFilePath,MAX_PATH,m_strPath);StringCchCat(szFilePath,MAX_PATH,L"\\*");WIN32_FIND_DATA FindFileData;HANDLE hListFile=FindFirstFile(szFilePath,&FindFileData);if(INVALID_HANDLE_VALUE==hListFile)return ;do{if(!lstrcmp(FindFileData.cFileName,L".")||!lstrcmp(FindFileData.cFileName,L"..")){continue;}if(FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY){WCHAR szFullPath[MAX_PATH]={0};StringCbPrintf(szFullPath,MAX_PATH,L"%s\\%s",m_strPath,FindFileData.cFileName);m_vecPathList.push_back(szFullPath);}} while (FindNextFile(hListFile,&FindFileData));CleartheProject(m_vecPathList);DeleteListBox();MessageBox(L"清理完毕!");// TODO: 在此添加控件通知处理程序代码}BOOL CClearDebugDlg::CleartheProject(vector<CString>PathList){vector<CString>::iterator i;for(i=PathList.begin();i!=PathList.end();i++){ WCHAR szFilePath[MAX_PATH]={0};StringCbCopy(szFilePath,MAX_PATH,*i);StringCchCat(szFilePath,MAX_PATH,L"\\*");WIN32_FIND_DATA FindFileData;HANDLE hListFile=FindFirstFile(szFilePath,&FindFileData);if(INVALID_HANDLE_VALUE==hListFile)return FALSE;do{if(!lstrcmp(FindFileData.cFileName,L".")||!lstrcmp(FindFileData.cFileName,L"..")){continue;}WCHAR szDebugFullPath[MAX_PATH]={0};WCHAR szIpchFullPath[MAX_PATH] ={0};WCHAR szStrFullPath[MAX_PATH] ={0};int a= wcscmp(FindFileData.cFileName,L"Debug");if(a==0&&(FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)){::StringCbPrintfW(szDebugFullPath,MAX_PATH,L"%s\\%s",i->GetBuffer(),FindFileData.cFileName);m_vecDebugFile.push_back(szDebugFullPath);m_vecListBox.push_back(szDebugFullPath);}int b= wcscmp(FindFileData.cFileName,L"ipch");if(b==0&&(FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)){::StringCbPrintfW(szIpchFullPath,MAX_PATH,L"%s\\%s",i->GetBuffer(),FindFileData.cFileName);m_vecIpchFile.push_back(szIpchFullPath);m_vecListBox.push_back(szIpchFullPath);}CString LocalStr=(CString)FindFileData.cFileName;if(-1!=LocalStr.Find(L".sdf",1)||-1!=LocalStr.Find(L".suo",1)){::StringCbPrintfW(szStrFullPath,MAX_PATH,L"%s\\%s",i->GetBuffer(),FindFileData.cFileName);m_vecStrFile.push_back(szStrFullPath);m_vecListBox.push_back(szStrFullPath);}}while (FindNextFile(hListFile,&FindFileData));}ToScreen();if(m_vecDebugFile.size()==0&&m_vecIpchFile.size()==0&&m_vecStrFile.size()==0){MessageBox(L"没有要清理的文件或文件夹!");return FALSE;}else{//ToScreen();if(1==DeleteTheItem1(m_vecIpchFile)){m_vecIpchFile.clear();};if(1==DeleteTheItem1(m_vecDebugFile)){m_vecDebugFile.clear();};if (1==DeleteTheItem2(m_vecStrFile)){};}/*PathList.clear();*/m_vecPathList.clear();//每次要清理下路径vector 不然会重复的添加条目return TRUE;}BOOL CClearDebugDlg::DeleteTheItem1(vector<CString>File){ int n=0;for(vector<CString>::iterator i=File.begin();i!=File.end();i++){/* i=File.erase(i);//迭代器删除时要注意*///将删除项目添加到listboxRemoveDirectoryW((LPWSTR)i->GetBuffer());DeleteDir(i->GetBuffer());}File.clear();return TRUE;}BOOL CClearDebugDlg::DeleteTheItem2(vector<CString>File){int n=0;for(vector<CString>::iterator i=m_vecStrFile.begin();i!=m_vecStrFile.end();i++){int a= GetLastError();::DeleteFile(*i);/* i=m_vecStrFile.erase(i);//迭代器删除时要注意*/}m_vecStrFile.clear();return TRUE;}void CClearDebugDlg::DeleteDir( CString dir){SHFILEOPSTRUCT DirOp;ZeroMemory((void*)&DirOp,sizeof(SHFILEOPSTRUCT));DirOp.fFlags = FOF_NOCONFIRMATION;DirOp.hNameMappings = NULL;DirOp.hwnd = NULL;DirOp.lpszProgressTitle = NULL;CString localDir=dir+‘\0‘;LPWSTR dir1=(LPWSTR&)localDir;DirOp.pFrom = dir1;DirOp.pTo = NULL;DirOp.wFunc = FO_DELETE;SHFileOperation(&DirOp);return ;}//将路径写入注册表BOOL CClearDebugDlg::WirtePathToReg(){if(m_strPath.GetLength()==0){MessageBox(L" 路径获取成功!");return FALSE;}CString SubKey=L"VSProjectPath";if(ERROR_SUCCESS==RegCreateKey(HKEY_CURRENT_USER,SubKey,&m_key)){MessageBox(L"路径获取成功");};LPVOID szPath=(LPVOID&)m_strPath;RegSetKeyValue(m_key,SubKey,NULL,REG_SZ,szPath,wcslen((LPWSTR)szPath)*sizeof(LPVOID)+1);return TRUE;}//查询注册表BOOL CClearDebugDlg::FindPath(){LPCTSTR SubKey=L"VSProjectPath\\VSProjectPath";WCHAR szPath[MAX_PATH]={0};DWORD Length=sizeof(szPath);if(ERROR_SUCCESS!=RegGetValue(HKEY_CURRENT_USER,SubKey,NULL,RRF_RT_REG_SZ,NULL,(LPVOID)szPath,&Length))return FALSE;m_strPath=szPath;return TRUE;}//删除注册表中的地址void CClearDebugDlg::DeleteReg(){LPCTSTR SubKey=L"VSProjectPath\\VSProjectPath";RegDeleteKey(HKEY_CURRENT_USER,SubKey);}void CClearDebugDlg::OnLbnSelchangeList1(){// TODO: 在此添加控件通知处理程序代码}void CClearDebugDlg::ToScreen(){for(vector<CString>::iterator i=m_vecListBox.begin();i!=m_vecListBox.end();i++){m_listbox.AddString((LPCTSTR)i->GetBuffer());}}void CClearDebugDlg::DeleteListBox(){for(int n=m_vecListBox.size();n>=0;n--){Sleep(300);m_listbox.DeleteString(n);}m_vecListBox.clear();}void CClearDebugDlg::OnDropFiles(HDROP hDropInfo)//拖拽获取工程路径{UINT nChars=DragQueryFile(hDropInfo, 0xFFFFFFFF,NULL,0);DragQueryFile(hDropInfo, 0,StrFileaddr,MAX_PATH);// TODO: 在此添加消息处理程序代码和/或调用默认值m_strPath=StrFileaddr;CDialogEx::OnDropFiles(hDropInfo);DragFinish(hDropInfo);//释放拖拽资源}
原文:http://www.cnblogs.com/hungryvampire/p/5299496.html