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