一个零时文件夹,文件夹里面又有文件夹和文件,在处理结束后要删除,我就递归先删除里面的,然后再删外面的,可是出现 145 error code 的错误,文件夹删除不掉. 不知道什么原因,高手指点下。查了RemoveDirectory  难道是有文件夹被打开了句柄 没有被关掉? 如果是这样的话怎么找出来呢? bool ForceRemoveDirectory(LPCTSTR szName )
{

HANDLE findHandle = ::FindFirstFile(csPattern, &finddata);
DWORD dwError; if(findHandle == INVALID_HANDLE_VALUE)
{
dwError = ::GetLastError(); if((dwError == ERROR_FILE_NOT_FOUND) || (dwError == ERROR_PATH_NOT_FOUND))
{
::SetLastError(NO_ERROR);
}
else
{ return false;
}
}
else
{
do
{

if(CString(finddata.cFileName) == _T(".") || (CString(finddata.cFileName) == _T(".."))
continue; CString  csPath = szName + filename[nameindex]; if(finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
ForceRemoveDirectory(csPath, &csErrorFileTemp[nameindex]);
}
else
{
DeleteFile(csPath);
}

}  } while(::FindNextFile(findHandle, &finddata));

if(!::RemoveDirectory(szName))
{

dwError = ::GetLastError(); if((dwError == ERROR_FILE_NOT_FOUND)||(dwError == ERROR_PATH_NOT_FOUND))
{
::SetLastError(NO_ERROR);
return true;
}

return false;
}
return true;
}

解决方案 »

  1.   

    The RemoveDirectory function s a directory for deletion on close. Therefore, the directory is not removed until the last handle to the directory is closed.To recursively delete the files in a directory, use the SHFileOperation function.
      

  2.   

    这是我写的,你可以参考一下//删除指定文件夹
    bool CYourClass::DeleteFolder(wchar_t* pwcPath )
    {
        if(pwcPath == NULL)
            return false;    wchar_t wcPath[MAX_PATH] = {0};
        wcscpy_s(wcPath,MAX_PATH,pwcPath);
        wcscat_s(wcPath,MAX_PATH,_T("\\*.*"));
        WIN32_FIND_DATA FindFileData;
        ZeroMemory(&FindFileData,sizeof(WIN32_FIND_DATA));    HANDLE hFindFile = FindFirstFile(wcPath,&FindFileData);    if(hFindFile == INVALID_HANDLE_VALUE)
            return false;    BOOL bContinue = true;    while (bContinue != false)
        {
            //bIsDots为真表示是.或..
            bool bIsDots = (wcscmp(FindFileData.cFileName,_T(".")) == 0 || wcscmp(FindFileData.cFileName,_T("..")) == 0);
            if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0 && bIsDots == false)
            {
                //是目录,就再进入该目录
                wcscpy_s(wcPath,MAX_PATH,pwcPath);
                wcscat_s(wcPath,MAX_PATH,_T("\\"));
                wcscat_s(wcPath,MAX_PATH,FindFileData.cFileName);
                DeleteFolder(wcPath);
                //寻找下一文件
                bContinue = FindNextFile(hFindFile,&FindFileData);
                continue;
            }        if (bIsDots == false)
            {
                //是文件删除之
                wcscpy_s(wcPath,MAX_PATH,pwcPath);
                wcscat_s(wcPath,MAX_PATH,_T("\\"));
                wcscat_s(wcPath,MAX_PATH,FindFileData.cFileName);
                DeleteFile(wcPath);
            }
            //寻找下一文件
            bContinue = FindNextFile(hFindFile,&FindFileData);    }    FindClose(hFindFile);    //删除空目录
        RemoveDirectory(pwcPath);
        return true;
    }