Microsoft Visual C++6.0
新建一个基于对话框的应用程序,工程名为DeleteUnEmptyFold
界面设计如下:
对“>>”按钮添加响应函数OnGetfold() ,响应函数OnGetfold() 代码如下:void CDeleteUnEmptyFoldDlg::OnGetfold() //弹出目录对话框,选择目录{ LPMALLOC pMalloc; //定义指向IMalloc的指针 if (::SHGetMalloc(&pMalloc) != NOERROR) return; // failed to get allocator char szDisplayName[_MAX_PATH]; char szBuffer[_MAX_PATH]; BROWSEINFO browseInfo;//构造对话框结构 browseInfo.hwndOwner = this->m_hWnd; browseInfo.pidlRoot = NULL;// 设置根目录为桌面 browseInfo.pszDisplayName = szDisplayName; browseInfo.lpszTitle = '选择删除的目录'; //对话框标题 browseInfo.ulFlags = BIF_RETURNFSANCESTORS|BIF_RETURNONLYFSDIRS; browseInfo.lpfn = NULL; // 未用 browseInfo.lParam = 0; // 未用 LPITEMIDLIST lpItemIDList; if ((lpItemIDList = ::SHBrowseForFolder(&browseInfo))!= NULL) { //得到目录的路径 if (::SHGetPathFromIDList(lpItemIDList, szBuffer)) { if (szBuffer[0] == '\0') { return ; } m_strFold = szBuffer; UpdateData(false); } else { AfxMessageBox('不能得到所选的文件夹!',MB_ICONSTOP|MB_OK); return; } pMalloc->Free(lpItemIDList); pMalloc->Release(); }}
在CDeleteUnEmptyFoldDlg类中添加RecursiveDelete()函数,代码如下:void CDeleteUnEmptyFoldDlg::RecursiveDelete(CString szPath){ CFileFind filefind; CString path = szPath; if(path.Right(1) != '\\')//目录的最右边需要“\”字符 path += '\\'; path += '*.*'; BOOL res = filefind.FindFile(path); while(res) { res = filefind.FindNextFile(); //是文件时直接删除 if (!filefind.IsDots() && !filefind.IsDirectory()) DeleteFile(filefind.GetFilePath());//删除文件 else if (filefind.IsDots()) continue; else if (filefind.IsDirectory())//为目录 { path = filefind.GetFilePath(); //是目录时继续递归,删除该目录下的文件 RecursiveDelete(path); //目录为空后删除目录 RemoveDirectory((LPCTSTR)path); } }}
对“删除”按钮添加响应函数OnDelete() ,响应函数OnDelete() 代码如下:void CDeleteUnEmptyFoldDlg::OnDelete() { // TODO: Add your control notification handler code here UpdateData(true); RecursiveDelete(m_strFold); //最终目录被清空了,于是删除该目录 if(RemoveDirectory((LPCTSTR)m_strFold)) { AfxMessageBox('删除成功!'); }}
程序运行如下:
注意递归删除非空文件夹