【路径相关方法】5,清空删除文件夹

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字符环境。



你可能感兴趣的:(【路径相关方法】5,清空删除文件夹)