免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5934 | 回复: 20
打印 上一主题 下一主题

[算法] 【分享】 递归删除文件夹 [复制链接]

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-25 12:45 |只看该作者 |倒序浏览

  1. void SearchFiles(const char* directory, list<string>& fileList)
  2. {
  3.         char path[MAX_PATH];
  4.         sprintf(path, "%s\\%s", directory, "*.*");

  5.         WIN32_FIND_DATA finddata;
  6.         HANDLE handle = FindFirstFile(path, &finddata);

  7.         do
  8.         {
  9.                 if (strcmp(finddata.cFileName, ".") &&
  10.                         strcmp(finddata.cFileName, "..")
  11.                         )
  12.                 {
  13.                         string s = finddata.cFileName;
  14.                         fileList.push_back(s);
  15.                 }

  16.         }while(FindNextFile(handle, &finddata));

  17.         FindClose(handle);
  18. }

  19. void DeleteFilesRecurse(const char* directory)
  20. {
  21.         list<string> fileList;
  22.         SearchFiles(directory, fileList);

  23.         for (list<string>::iterator it = fileList.begin(); it != fileList.end(); it++)
  24.         {
  25.                 char path[MAX_PATH] = {0};
  26.                 sprintf(path, "%s\\%s", directory, (*it).c_str());

  27.                 WIN32_FIND_DATA finddata;
  28.                 HANDLE handle = FindFirstFile(path, &finddata);

  29.                 if (finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  30.                 {
  31.                         DeleteFilesRecurse(path);
  32.                 }
  33.                 else
  34.                 {
  35.                             DeleteFileA(path);
  36.                 }

  37.                 FindClose(handle);
  38.         }

  39.         RemoveDirectoryA(directory);
  40. }
复制代码

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
2 [报告]
发表于 2012-10-25 12:49 |只看该作者
刚写的一个比较满意的函数, 分享给大家了,

感觉技术上团结起来太有必要了, 要不虐人,要不被虐啊!,
我现在被虐死掉了

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2012-10-25 13:19 |只看该作者
何必用list保存结果呢,直接删除

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2012-10-25 13:20 |只看该作者
或者直接用SHFileOperation

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
5 [报告]
发表于 2012-10-25 13:32 |只看该作者
…………………………你确定这个是生产用代码?完全木有错误处理啊!!

下面的代码由我的开源项目lpath中对应代码经过稍加改写得到,主要是剔除掉了Lua相关部分(lpath是平台无关的路径操作例程到Lua语言的绑定库),换掉了错误处理函数(原先是交给Lua处理,这个版本直接打印出来了),因为Lua的错误处理类似异常,会longjmp,所以这个版本看上去要臃肿一些。其实原理是很简单的,很好理解,而且具备扩展性!
  1. #include <stdio.h>
  2. #include <Windows.h>

  3. void print_lasterror(const char *title, DWORD errnum) {
  4.     const char *msg;
  5.     FormatMessageA(
  6.             FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
  7.             NULL,
  8.             errnum,
  9.             MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  10.             (LPSTR)&msg,
  11.             0, NULL);
  12.     fprintf(stderr, "%s: %s\n", title, msg);
  13.     LocalFree((LPSTR)msg);
  14. }

  15. typedef int PathIter(void *ud, const char *path, int isdir);

  16. int removedir(const char *directory);

  17. int iterpath(const char *directory, PathIter *iter, void *ud) {
  18.     WIN32_FIND_DATA wfd;
  19.     HANDLE h;
  20.     DWORD errnum;
  21.     char path[MAX_PATH];
  22.     strcpy(path, directory);
  23.     strcat(path, "\\*");

  24.     if ((h = FindFirstFile(path, &wfd)) == INVALID_HANDLE_VALUE) {
  25.         print_lasterror(path, GetLastError());
  26.         return 0;
  27.     }
  28.     do {
  29.         if (    strcmp(wfd.cFileName, ".") == 0 ||
  30.                 strcmp(wfd.cFileName, "..") == 0)
  31.             continue;
  32.         if (iter(ud, wfd.cFileName,
  33.                     (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)) {
  34.             FindClose(h);
  35.             return 0;
  36.         }
  37.     }
  38.     while (FindNextFile(h, &wfd));
  39.     if ((errnum = GetLastError()) != ERROR_NO_MORE_FILES) {
  40.         print_lasterror("FindNextFile", errnum);
  41.         return 0;
  42.     }
  43.     FindClose(h);
  44.     return 1;
  45. }

  46. int remove_iter(void *ud, const char *path, int isdir) {
  47.     char newpath[MAX_PATH];
  48.     strcpy(newpath, (const char*)ud);
  49.     strcat(newpath, "\\");
  50.     strcat(newpath, path);
  51.     if (isdir)
  52.         return !removedir(newpath);
  53.     else if (!DeleteFileA(newpath)) {
  54.         print_lasterror(newpath, GetLastError());
  55.         return 1;
  56.     }
  57.     return 0;
  58. }

  59. int removedir(const char *path) {
  60.     if (!iterpath(path, remove_iter, (void*)path))
  61.         return 0;
  62.     if (!RemoveDirectoryA(path)) {
  63.         print_lasterror(path, GetLastError());
  64.         return 0;
  65.     }
  66.     return 1;
  67. }
复制代码

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
6 [报告]
发表于 2012-10-25 14:49 |只看该作者
我要是说python5行搞定你信吗...

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
7 [报告]
发表于 2012-10-25 14:50 |只看该作者
可能要10行.

linux_c_py_php 发表于 2012-10-25 14:49
我要是说python5行搞定你信吗...

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
8 [报告]
发表于 2012-10-25 14:51 |只看该作者
回复 7# linux_c_py_php


    这种函数对python来说应该是标准库内置吧?

论坛徽章:
223
2022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:32操作系统版块每日发帖之星
日期:2016-05-10 19:22:58操作系统版块每日发帖之星
日期:2016-02-18 06:20:00操作系统版块每日发帖之星
日期:2016-03-01 06:20:00操作系统版块每日发帖之星
日期:2016-03-02 06:20:0015-16赛季CBA联赛之上海
日期:2019-09-20 12:29:3219周年集字徽章-周
日期:2019-10-01 20:47:4815-16赛季CBA联赛之八一
日期:2020-10-23 18:30:5320周年集字徽章-20	
日期:2020-10-28 14:14:2615-16赛季CBA联赛之广夏
日期:2023-02-25 16:26:26CU十四周年纪念徽章
日期:2023-04-13 12:23:10操作系统版块每日发帖之星
日期:2016-05-10 19:22:58
9 [报告]
发表于 2012-10-25 14:51 |只看该作者
为什么自己实现啊?? linux bash call
rm -rf dir

论坛徽章:
5
技术图书徽章
日期:2013-08-17 07:26:49双子座
日期:2013-09-15 16:46:29双子座
日期:2013-09-25 08:17:09技术图书徽章
日期:2013-09-25 09:11:42天秤座
日期:2013-10-01 16:25:34
10 [报告]
发表于 2012-10-25 15:03 |只看该作者
回复 7# linux_c_py_php


    我不信~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP