一个零时文件夹,文件夹里面又有文件夹和文件,在处理结束后要删除,我就递归先删除里面的,然后再删外面的,可是出现 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;
}
{
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;
}
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;
}