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