BOOL CFileUtil::RecurseRemoveDir(char* szPathName) { DIR* pDIR; struct dirent* pDirEnt; char szTemp[MAX_PATH]; BOOL bValid; char szDirectory[MAX_PATH]; struct stat sBuffer; int iStatus; BOOL bDir; strcpy(szDirectory, szPathName); RemoveFileSeparator(szDirectory); pDIR = opendir(szPathName); if (pDIR == NULL) { return FALSE; } pDirEnt = readdir(pDIR); while (pDirEnt != NULL) { bValid = TRUE; if (!((strcmp(pDirEnt->d_name, ".") == 0) || (strcmp(pDirEnt->d_name, "..") == 0))) { strcpy(szTemp, szDirectory); strcat(szTemp, FILE_SEPARATOR); strcat(szTemp, pDirEnt->d_name); iStatus = stat(szTemp, &sBuffer); if (iStatus == -1) { printf("%s: %s\n", strerror(errno), szTemp); return FALSE; } bDir = S_ISDIR(sBuffer.st_mode); if (bDir) //Directory { RemoveDir(szTemp); } else { unlink(szTemp); } } pDirEnt = readdir(pDIR); } closedir(pDIR); rmdir(szDirectory); return TRUE; }
BOOL CFileUtil::RemoveDir(const char*szPathName) { WIN32_FIND_DATA sFindData; CChars szFindName; CChars szTemp; HANDLE hFindHandle; BOOL bContinue; BOOL bValid; CChars szDirectory; BOOL bDeleted; szDirectory.Init(szPathName); RemoveFileSeparator(&szDirectory); szFindName.Init(szPathName); AppendToPath(&szFindName, "*.*"); hFindHandle = FindFirstFile(szFindName.Text(), &sFindData); bContinue = (hFindHandle != INVALID_HANDLE_VALUE); bDeleted = TRUE; while (bContinue) { bValid = TRUE; if (sFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if (!((strcmp(sFindData.cFileName, ".") == 0) || (strcmp(sFindData.cFileName, "..") == 0))) { szTemp.Init(szDirectory); AppendToPath(&szTemp, sFindData.cFileName); RemoveDir(szTemp.Text()); szTemp.Kill(); } } else { szTemp.Init(szPathName); AppendToPath(&szTemp, sFindData.cFileName); bDeleted &= DeleteFile(szTemp.Text()); szTemp.Kill(); } bContinue = FindNextFile(hFindHandle, &sFindData); } FindClose(hFindHandle); RemoveDirectory(szDirectory.Text()); szDirectory.Kill(); szFindName.Kill(); return bDeleted; }