1、利用API函数SHFileOperation实现的删除函数,能够一次删除目录及其下面的子目录和文件 或者 删除单个的文件:
// 删除文件(第二个参数bDelete表示是否删除至回收站,默认删除到回收站)
BOOL RecycleFileOrFolder(CString strPath, BOOL bDelete/*=FALSE*/)
{
strPath += '\0';
SHFILEOPSTRUCT shDelFile;
memset(&shDelFile,0,sizeof(SHFILEOPSTRUCT));
shDelFile.fFlags |= FOF_SILENT; // 不显示进度
shDelFile.fFlags |= FOF_NOERRORUI; // 不报告错误信息
shDelFile.fFlags |= FOF_NOCONFIRMATION; // 直接删除,不进行确认
// 设置SHFILEOPSTRUCT的参数为删除做准备
shDelFile.wFunc = FO_DELETE; // 执行的操作
shDelFile.pFrom = strPath; // 操作的对象,也就是目录(注意:以“\0\0”结尾)
shDelFile.pTo = NULL; // 必须设置为NULL
if (bDelete) //根据传递的bDelete参数确定是否删除到回收站
{
shDelFile.fFlags &= ~FOF_ALLOWUNDO; //直接删除,不进入回收站
}
else
{
shDelFile.fFlags |= FOF_ALLOWUNDO; //删除到回收站
}
BOOL bres = SHFileOperation(&shDelFile); //删除
return !bres;
}
2、另外,还有通过递归逐个删除的方法:
BOOL DeleteFolderOrFile(CString strPath)
{
DWORD dwAttr = GetFileAttributes(strPath); //得到文件属性
BOOL bRes = TRUE;
if ( dwAttr == 0xFFFFFFFF ) // 文件或目录不存在
{
return FALSE;
}
else if ( dwAttr & FILE_ATTRIBUTE_DIRECTORY )
{
if ( !DeleteFolder(strPath) )
{
bRes = FALSE;
}
}
else
{
if ( !DeleteFile(strPath) )
{
bRes = FALSE;
}
}
return bRes;
}
BOOL DeleteFolder(CString strPath)
{
BOOL bRes = TRUE;
BOOL bTemp;
CFileFind finder;
CString path = strPath + _T("\\*.*");
BOOL bWorking = finder.FindFile(path);
while(bWorking)
{
bWorking = finder.FindNextFile();
path = finder.GetFilePath();
if (!finder.IsDots())
{
if(finder.IsDirectory())
{
bTemp = DeleteFolder(path); // 递归
bRes = bTemp && bRes ? TRUE : FALSE;
}
else
{
bTemp = DeleteFile(path); // 删除文件
bRes = bTemp && bRes ? TRUE : FALSE;
}
}
}
bTemp = RemoveDirectory(strPath); // 删除空文件夹
bRes = bTemp && bRes ? TRUE : FALSE;
return bRes;
}
3、关于文件属性的判断:GetFileAttributes