今天写一个删除目录的程序(目录下包含子目录),遇到点问题,代码如下:
///////////////////////////////////////// // 删除目录及子目录下所有文件 // ///////////////////////////////////////// BOOL DeleteAllFileFromDirectoryW(LPCWSTR lpPath) { HANDLE hFind; WCHAR wzDeletePath[MAX_PATH] = { 0 }; WIN32_FIND_DATA findFileData; BOOL bRet = FALSE; ZeroMemory(&findFileData, sizeof(WIN32_FIND_DATA)); //切换到要删除的路径 // _wchdir(lpPath); //检查路径是否以“\”结尾 // wcscpy_s(wzDeletePath, MAX_PATH, lpPath); if (L‘\\‘ != wzDeletePath[wcslen(wzDeletePath) - 1]) { wcscat_s(wzDeletePath, MAX_PATH, L"\\"); } //在路径后面添加通配符“*.*” // wcscat_s(wzDeletePath, MAX_PATH, L"*.*"); //寻找第一个文件 // hFind = FindFirstFileW(wzDeletePath, &findFileData); if (INVALID_HANDLE_VALUE == hFind) { //错误提示,路径不存在 return bRet; } //开始遍历 // do { wcscpy_s(wzDeletePath, MAX_PATH, lpPath); wcscat_s(wzDeletePath, MAX_PATH, L"\\"); wcscat_s(wzDeletePath, MAX_PATH, findFileData.cFileName); //如果是目录,过滤掉“.”和“..”目录,递归遍历 // if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if ((0 == wcscmp(L".", findFileData.cFileName)) || (0 == wcscmp(L"..", findFileData.cFileName))) { continue; } //递归遍历 DeleteAllFileFromDirectoryW(wzDeletePath); } //文件,直接删除 // else { if (!DeleteFileW(wzDeletePath)) { //错误输出,删除文件失败 continue; } } } while (FindNextFileW(hFind, &findFileData)); //文件夹遍历完毕后切换到父文件夹,删除此文件夹 // _wchdir(L".."); if (!RemoveDirectoryW(lpPath)) { //错误输出,删除文件夹失败 return bRet; } bRet = TRUE; return bRet; }
程序运行后发现总有一些文件夹没删除,当时特别疑惑,就在“RemoveDirectoryW”处打了断点,用GetCurrentDirectoryW函数获取当前路径,用GetLastError观测错误代码
最后发现在删除一些文件夹失败时,错误代码为145-目录不是空的。此时将程序终止,去查看此目录是否为空,发现确实是空的。奇怪了,每次删除目录前是先切换到父目录呀,而且确实目录下没有文件了呀,郁闷。。
又把程序仔仔细细的看了几遍,去找了文件遍历的例子看了看,忽然发现自己犯了一个二笔的错误,遍历文件后忘记了这句:
FindClose(hFind);
真是粗心啊,文件搜索的句柄没有关闭导致文件夹无法删除,但是为什么其它文件夹就能删除呢?这个问题就不知道了,反正问题解决了,以后写程序要细心啊,不能犯这种低级错误了。
把正确的代码放到下面,如果你需要参考,别复制错了^_^
///////////////////////////////////////// // 删除目录及子目录下所有文件 // ///////////////////////////////////////// BOOL DeleteAllFileFromDirectoryW(LPCWSTR lpPath) { HANDLE hFind; WCHAR wzDeletePath[MAX_PATH] = { 0 }; WIN32_FIND_DATA findFileData; BOOL bRet = FALSE; ZeroMemory(&findFileData, sizeof(WIN32_FIND_DATA)); //切换到要删除的路径 // _wchdir(lpPath); //检查路径是否以“\”结尾 // wcscpy_s(wzDeletePath, MAX_PATH, lpPath); if (L‘\\‘ != wzDeletePath[wcslen(wzDeletePath) - 1]) { wcscat_s(wzDeletePath, MAX_PATH, L"\\"); } //在路径后面添加通配符“*.*” // wcscat_s(wzDeletePath, MAX_PATH, L"*.*"); //寻找第一个文件 // hFind = FindFirstFileW(wzDeletePath, &findFileData); if (INVALID_HANDLE_VALUE == hFind) { //错误提示,路径不存在 return bRet; } //开始遍历 // do { wcscpy_s(wzDeletePath, MAX_PATH, lpPath); wcscat_s(wzDeletePath, MAX_PATH, L"\\"); wcscat_s(wzDeletePath, MAX_PATH, findFileData.cFileName); //如果是目录,过滤掉“.”和“..”目录,递归遍历 // if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if ((0 == wcscmp(L".", findFileData.cFileName)) || (0 == wcscmp(L"..", findFileData.cFileName))) { continue; } //递归遍历 DeleteAllFileFromDirectoryW(wzDeletePath); } //文件,直接删除 // else { if (!DeleteFileW(wzDeletePath)) { //错误输出,删除文件失败 continue; } } } while (FindNextFileW(hFind, &findFileData)); FindClose(hFind); //文件夹遍历完毕后切换到父文件夹,删除此文件夹 // _wchdir(L".."); if (!RemoveDirectoryW(lpPath)) { //错误输出,删除文件夹失败 return bRet; } bRet = TRUE; return bRet; }
时间: 2024-10-07 16:19:27