1,原理
遍历文件夹,当是文件,就删除,是文件夹就递归。最后移除文件夹。
2,实现
MFC版本:
使用CFileFind类遍历。
BOOL MyDeleteFolder(CString strPath)
{
CFileFind ff;
BOOL bFound;
bFound = ff.FindFile(strPath + L"\\*.*");
while(bFound)
{
bFound = ff.FindNextFile();
CString strFilePath = ff.GetFilePath();
if(ff.IsDirectory())
{
if(!ff.IsDots())
{
//是除了"."和".."之外的文件夹
MyDeleteFolder(strFilePath);
}
}
else
{
//若文件只读,修改文件属性
if(ff.IsReadOnly())
{
::SetFileAttributes(strFilePath, FILE_ATTRIBUTE_NORMAL);
}
::DeleteFile(strFilePath);
}
}
ff.Close();
return ::RemoveDirectory(strPath.GetString());
}
Platform SDK版本:
BOOL MyDeleteFolder(WCHAR* szFolderPath)
{
//保存路径
WCHAR szPath[MAX_PATH] = {0};
wcscpy_s(szPath,MAX_PATH,szFolderPath);
//查找所有文件的通配符路径
WCHAR szFileFilter[MAX_PATH] = {0};
wcscpy_s(szFileFilter,MAX_PATH,szPath);
wcscat_s(szFileFilter,MAX_PATH,L"\\*.*");
WIN32_FIND_DATA fileinfo;
HANDLE hFind = NULL;
hFind = ::FindFirstFile(szFileFilter,&fileinfo);
do
{
//文件完整路径
WCHAR szTmp[MAX_PATH] = {0};
wcscpy_s(szTmp,MAX_PATH,szPath);
wcscat_s(szTmp,MAX_PATH,L"\\");
wcscat_s(szTmp,MAX_PATH,fileinfo.cFileName);
//如果是文件夹
if(fileinfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if ((0 != wcscmp(fileinfo.cFileName,L".")) && (0 != wcscmp(fileinfo.cFileName,L"..")))
{
//是除了"."和".."之外的文件夹,递归删除
MyDeleteFolder(szTmp);
}
}
else
{
//是文件,删除
if(fileinfo.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
{
::SetFileAttributes(szTmp, FILE_ATTRIBUTE_NORMAL);
}
::DeleteFile(szTmp);
}
}while(::FindNextFile(hFind,&fileinfo));
::FindClose(hFind);
return ::RemoveDirectory(szPath);
}
UNICODE字符环境。