多语言展示
当前在线:1695今日阅读:145今日分享:43

MFC应用实例:[62]删除非空目录

文件夹有可能不是空的,我们要对其进行删除,操作如下:
工具/原料

Microsoft Visual C++6.0

方法/步骤
1

新建一个基于对话框的应用程序,工程名为DeleteUnEmptyFold

2

界面设计如下:

3

对“>>”按钮添加响应函数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();    }}

4

在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); } }}

5

对“删除”按钮添加响应函数OnDelete() ,响应函数OnDelete() 代码如下:void CDeleteUnEmptyFoldDlg::OnDelete() { // TODO: Add your control notification handler code here UpdateData(true); RecursiveDelete(m_strFold); //最终目录被清空了,于是删除该目录 if(RemoveDirectory((LPCTSTR)m_strFold)) { AfxMessageBox('删除成功!'); }}

6

程序运行如下:

注意事项

注意递归删除非空文件夹

推荐信息