免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: evaspring
打印 上一主题 下一主题

Linux 遍历目录有没有什么好方法? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-06-01 19:22 |只看该作者
回复 10# 三月廿七


260这个要分是不是NTFS/FAT。NTFS这个代码就要有问题。因为NTFS单文件名就可以有MAX_PATH,那么多层路径下来,这个就有问题。

论坛徽章:
0
12 [报告]
发表于 2012-06-01 19:28 |只看该作者
类似的还有createprocess函数,还有createfile函数,过于复杂,分解不到位。

另外内存文件系函数也是及其不合理的设计,特别是几个标志位被分割了,导致内存文件使用远远没有mmap方便。

总之,win的设计,特别是kernel对外接口,不好,正交和最小化被严重破坏

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
13 [报告]
发表于 2012-06-01 19:32 |只看该作者
walleeee 发表于 2012-06-01 19:22
回复 10# 三月廿七


批评与自我批评?

论坛徽章:
0
14 [报告]
发表于 2012-06-01 19:34 |只看该作者
回复 10# 三月廿七


    Sleep大概还不算畸形……

论坛徽章:
0
15 [报告]
发表于 2012-06-01 19:35 |只看该作者
回复 13# mirnshi


    抱怨一下

论坛徽章:
3
寅虎
日期:2013-11-27 07:53:29申猴
日期:2014-09-12 09:24:152015年迎新春徽章
日期:2015-03-04 09:48:31
16 [报告]
发表于 2012-06-02 16:00 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
17 [报告]
发表于 2012-06-02 22:02 |只看该作者
本帖最后由 ran3guns 于 2012-06-02 22:05 编辑

回复 1# evaspring


    1. 你要遍历目录(树),自然是遍历代码简单了。树的遍历当然可以写成非递归,但是太麻烦了。
    2. 不调用chdir, 改变工作目录,这个可以用一个保存路径来达到。附个代码:
  1. /*
  2. * =====================================================================================
  3. *       Filename:  scandir.c
  4. *    Description:  scan the directory and print all the files
  5. *                  except hide
  6. *        Version:  1.0
  7. *        Created:  06/02/2012 09:40:15 PM
  8. *       Revision:  none
  9. *       Compiler:  gcc
  10. *         Author:  ran3guns
  11. * =====================================================================================
  12. */
  13. #include <unistd.h>
  14. #include <dirent.h>
  15. #include <sys/stat.h>

  16. #include <stdlib.h>
  17. #include <stdio.h>
  18. #include <string.h>
  19. #include <limits.h>

  20. static void scan_dir(const char *path, int depth);

  21. static char FULLPATH[PATH_MAX + 1];

  22. int main(int argc, const char *argv[])
  23. {
  24.         const char *pathname;
  25.         int depth = 0;

  26.         if (2 != argc) {
  27.                 fprintf(stderr, "Usage: ./scan_dir <path-name>\n");
  28.                 exit(EXIT_FAILURE);
  29.         }
  30.         pathname = argv[1];
  31.         strncpy(FULLPATH, pathname, strlen(pathname) + 1);

  32.         scan_dir(FULLPATH, depth);

  33.         exit(EXIT_SUCCESS);
  34. }
  35. static void scan_dir(const char *path, int depth)
  36. {
  37.         struct stat statbuf;
  38.         struct dirent *dirp;
  39.         DIR *dp;
  40.         char *ep;
  41.         
  42.         if ((dp = opendir(FULLPATH)) == NULL) {
  43.                 fprintf(stderr, "cannot open %s\n", FULLPATH);
  44.                 return;
  45.         }
  46.         ep = FULLPATH + strlen(FULLPATH);
  47.         *ep++ = '/';
  48.         *ep = 0;
  49.         while ((dirp = readdir(dp)) != NULL) {
  50.                 lstat(dirp->d_name, &statbuf);
  51.                 if (S_ISDIR(statbuf.st_mode)) {
  52.                         if (strcmp(".", dirp->d_name) == 0 ||
  53.                                         strcmp("..", dirp->d_name) == 0)
  54.                                 continue;
  55.                        printf("%*s%s\n", depth," ", dirp->d_name);
  56.                        strcpy(ep, dirp->d_name); /*  use a full path instead of chdir  */
  57.                        scan_dir(FULLPATH, depth + 4);
  58.                 }
  59.                 else  {
  60.                         if (dirp->d_name[0] != '.') /* except the hide files */
  61.                                printf("%*s%s\n", depth, " ", dirp->d_name);
  62.                 }
  63.         }
  64.         ep[-1] = '\0';
  65.         closedir(dp);
  66. }
复制代码

论坛徽章:
3
寅虎
日期:2013-11-27 07:53:29申猴
日期:2014-09-12 09:24:152015年迎新春徽章
日期:2015-03-04 09:48:31
18 [报告]
发表于 2012-06-02 22:17 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
19 [报告]
发表于 2012-06-02 22:20 |只看该作者
回复 19# Sevk


    windows下不懂。linux下,用lstat而不用stat,因为如果有软链接,那么容易形成死循环。windows应该也有类似的吧。

论坛徽章:
0
20 [报告]
发表于 2012-06-04 09:45 |只看该作者
MARK~~~~~~~~`
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP