Q:求一删除目录的算法!
A:为什么不用SHFileOperation函数?
1.BOOL DeleteDir(LPCTSTR lpszDir)
{
SHFILEOPSTRUCT FileOp;
//add begins...
TCHAR buf[_MAX_PATH+2];
memset(buf,0,sizeof(buf));
_tcscpy(buf,lpszDir);
//add ends...
memset(&FileOp,0,sizeof(SHFILEOPSTRUCT));
FileOp.hwnd=m_hWnd;
FileOp.wFunc=FO_DELETE;
FileOp.pFrom=buf; //改一下pFrom指针到buf.
FileOp.pTo=NULL;
FileOp.fFlags=FOF_NOCONFIRMATION¦FOF_SILENT¦FOF_ALLOWUNDO;
FileOp.fAnyOperationsAborted=FALSE;
FileOp.hNameMappings =NULL;
FileOp.lpszProgressTitle =NULL;
int rval=SHFileOperation(&FileOp);
if(rval==0)
{
if(FileOp.fAnyOperationsAborted==TRUE)
{
::AfxMessageBox("删除项目操作被取消!",MB_OK);
return FALSE;
}
else
{
//::AfxMessageBox("删除目录操作成功!",MB_OK);
return TRUE;
}
}
else
{
::AfxMessageBox("删除项目操作失败!",MB_OK¦MB_ICONEXCLAMATION);
return FALSE;
}
}2.BOOL DeleteDirectory(LPCTSTR strDes)
{//删除目标目录下的所有文件
WIN32_FIND_DATA FileData;
HANDLE hSearch;
BOOL bFinished=FALSE;
CString strTemp(strDes); strTemp+=_T("\\*.*");
hSearch=FindFirstFile((LPCTSTR)strTemp,&FileData);
if (hSearch==INVALID_HANDLE_VALUE)
{
bFinished=TRUE; //该目录下没有文件
}
while(!bFinished)
{
strTemp=strDes;
strTemp=strTemp+_T("\\")+FileData.cFileName;
//是目录就进入递归调用
if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
DeleteDirectory(strTemp);
}
else
{//是文件则删除
DeleteFile(strTemp);
}
if (!FindNextFile(hSearch,&FileData))
{
bFinished=TRUE;
}
}
FindClose(hSearch);
//删除空目录
RemoveDirectory(strDes);
return TRUE;
}
A:为什么不用SHFileOperation函数?
1.BOOL DeleteDir(LPCTSTR lpszDir)
{
SHFILEOPSTRUCT FileOp;
//add begins...
TCHAR buf[_MAX_PATH+2];
memset(buf,0,sizeof(buf));
_tcscpy(buf,lpszDir);
//add ends...
memset(&FileOp,0,sizeof(SHFILEOPSTRUCT));
FileOp.hwnd=m_hWnd;
FileOp.wFunc=FO_DELETE;
FileOp.pFrom=buf; //改一下pFrom指针到buf.
FileOp.pTo=NULL;
FileOp.fFlags=FOF_NOCONFIRMATION¦FOF_SILENT¦FOF_ALLOWUNDO;
FileOp.fAnyOperationsAborted=FALSE;
FileOp.hNameMappings =NULL;
FileOp.lpszProgressTitle =NULL;
int rval=SHFileOperation(&FileOp);
if(rval==0)
{
if(FileOp.fAnyOperationsAborted==TRUE)
{
::AfxMessageBox("删除项目操作被取消!",MB_OK);
return FALSE;
}
else
{
//::AfxMessageBox("删除目录操作成功!",MB_OK);
return TRUE;
}
}
else
{
::AfxMessageBox("删除项目操作失败!",MB_OK¦MB_ICONEXCLAMATION);
return FALSE;
}
}2.BOOL DeleteDirectory(LPCTSTR strDes)
{//删除目标目录下的所有文件
WIN32_FIND_DATA FileData;
HANDLE hSearch;
BOOL bFinished=FALSE;
CString strTemp(strDes); strTemp+=_T("\\*.*");
hSearch=FindFirstFile((LPCTSTR)strTemp,&FileData);
if (hSearch==INVALID_HANDLE_VALUE)
{
bFinished=TRUE; //该目录下没有文件
}
while(!bFinished)
{
strTemp=strDes;
strTemp=strTemp+_T("\\")+FileData.cFileName;
//是目录就进入递归调用
if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
DeleteDirectory(strTemp);
}
else
{//是文件则删除
DeleteFile(strTemp);
}
if (!FindNextFile(hSearch,&FileData))
{
bFinished=TRUE;
}
}
FindClose(hSearch);
//删除空目录
RemoveDirectory(strDes);
return TRUE;
}
解决方案 »
- VC 如何在控件中动态显示图片
- AFX_CTLCOLOR和AFX_MSG_CACHE
- 如何用socket获得局域网ip地址?
- 如何使AMCAP识别并调用自己的Filter
- vc中CFormView中添加了一个控件,坐标单位为twip,如何转换
- vc未入门者求助
- 急!!!!如何在一个有多个view的sdi程序里,从一个view里面取得其他view的指针?
- 这是怎么回事?奇怪?望指教?
- 进程控制...已知一个外部进程句柄,如何得知它已结束
- VC继承类的困惑!
- 请教:MFC的Socket封装类CAsyncSocket的问题
- 求救!!!如何将char ch[m]转换为char ch[n],(m>=n)
用FindFirstFile和FindNextFile枚举所有文件和子目录逐一删除。
或者,比较不要脸的方法:调用DOS的Deletetree dirname /y
如:ShellExecute(NULL,"Deletetree C:\\windows /y"...);
但是在Win2k中的通过cmd.com控制dos程序的运行