vc中删除文件夹以及文件夹中的内容的三种方法

来源:互联网 发布:天猫魔盒用什么软件 编辑:程序博客网 时间:2024/05/16 01:40
BOOL CDeleteFolderDlg::DeleteFolder(CString lpszPath)//删除文件夹以及文件夹内的文件

CHAR szFromPath[_MAX_PATH];//源文件路径
memcpy(szFromPath, lpszPath, lpszPath.GetLength());
szFromPath[lpszPath.GetLength() + 1] = '\0';//必须要以“\0\0”结尾,不然删除不了
szFromPath[lpszPath.GetLength() + 2] = '\0';


SHFILEOPSTRUCT FileOp; 
SecureZeroMemory((void*)&FileOp, sizeof(SHFILEOPSTRUCT));
//secureZeroMemory和ZeroMerory的区别
//根据MSDN上,ZeryMerory在当缓冲区的字符串超出生命周期的时候,
//会被编译器优化,从而缓冲区的内容会被恶意软件捕捉到。
//引起软件安全问题,特别是对于密码这些比较敏感的信息而说。
//而SecureZeroMemory则不会引发此问题,保证缓冲区的内容会被正确的清零。
//如果涉及到比较敏感的内容,尽量使用SecureZeroMemory函数。


FileOp.fFlags = FOF_NOCONFIRMATION;//操作与确认标志 
FileOp.hNameMappings = NULL;//文件映射 
FileOp.hwnd = NULL;//消息发送的窗口句柄;
FileOp.lpszProgressTitle = NULL;//文件操作进度窗口标题 
FileOp.pFrom = szFromPath;//源文件及路径 
FileOp.pTo = NULL;//目标文件及路径 
FileOp.wFunc = FO_DELETE;//操作类型 


return SHFileOperation(&FileOp) == 0;
}


bool  CDeleteFolderDlg::DeleteDirectory(CString DirName)
{
//AfxMessageBox("执行删除文件夹:" + DirName);
CString PUBPATH;
PUBPATH = DirName;
CFileFind tempFind;
DirName += "\\*.*";
BOOL IsFinded = (BOOL)tempFind.FindFile(DirName);
while(IsFinded)
{
IsFinded = (BOOL)tempFind.FindNextFile();
if(!tempFind.IsDots())
{
CString strDirName;
strDirName += PUBPATH;
strDirName += "\\";
strDirName += tempFind.GetFileName();
//AfxMessageBox("strDirName :" + strDirName);
if(tempFind.IsDirectory())
{
//strDirName += PUBPATH;
DeleteDirectory(strDirName);
}
else
{
SetFileAttributes(strDirName, FILE_ATTRIBUTE_NORMAL); //去掉文件的系统和隐藏属性
DeleteFile(strDirName);
}
}
}
tempFind.Close();
if(!RemoveDirectory(PUBPATH))
{
return false ;
}
//AfxMessageBox("文件夹删除成功...");
return true;
}


//方法二
bool  CDeleteFolderDlg::DeleteDirectory( char* DirName)
{
HANDLE hFirstFile = NULL; 
WIN32_FIND_DATA FindData; 


char currdir[MAX_PATH] = {0};
sprintf_s(currdir, "%s\\*.*", DirName);


hFirstFile = ::FindFirstFile(currdir, &FindData); 
if( hFirstFile == INVALID_HANDLE_VALUE ) 
return false;


BOOL bRes = true;


while(bRes) 

bRes = ::FindNextFile(hFirstFile, &FindData);


if( (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) //发现目录
{
if( !strcmp(FindData.cFileName, ".") || !strcmp(FindData.cFileName, "..") ) //.或..
continue;
else
{
char tmppath[MAX_PATH] = {0};
sprintf_s(tmppath, "%s\\%s", DirName, FindData.cFileName);


DeleteDirectory(tmppath);
}
}
else               //发现文件
{
char tmppath[MAX_PATH] = {0};
sprintf_s(tmppath, "%s\\%s", DirName, FindData.cFileName);
::DeleteFile(tmppath);    
}

::FindClose(hFirstFile);
if(!RemoveDirectory(DirName))
{
return false ;
}
return true;
}
0 0
原创粉丝点击