正文

遍历目录树2008-05-31 18:12:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/vfdff/35808.html

分享到:

  //从任意节点开始遍历目录树,Copyright   (C)   Y.B.Chen  //已经在   Borland   C++   3.1   for   DOS   和   Borland   C++   Builder   6.0   下编译通过       #include   <stdio.h>    #include   <conio.h>    #include   <dir.h>    #include   <dos.h>    #include   <string.h>      int   lines   =   0;   //保存已经显示出几行了,如果到了一屏需要暂停 int   bQuit   =   0;   //是否按了Esc键,如果按了Esc键,此数为非零,程序退出       void   clines(void)   //计算已经输出的行数,如果满一屏就暂停    {        unsigned   int   k;        if(lines&&(!(lines%23)))          {              printf("Press   any   key,   or   Esc   to   quit...");              if((k=getch())==0)   //函数等待用户按键,如果=0表示功能键                  k=getch()<<8;         //需要再次重新调用getch判断具体是哪个键                 //例如如果你按了向上移动光标的光标键,getch()返回值是0              //但是再次调用getch()时无条件返回0x48,即大写'H'的ASCII              //如果不这样编,程序就误认为是按了两次按键,一次是'\0',              //一次是'H',为了避免混淆'H'和以光标键,把移光标键移动到              //变量'k'的高8位,即k=0x4800              //最后结论:   k==0x0048是大写'H',k==0x4800是移光标键                 if(k==27)                     //Esc键的ASCII是27                  bQuit   =   1;              printf("\r\n");          }        lines++;    }       void   dirall(const   char   *path)   //递归函数,从path节点遍历目录树    {        struct   ffblk   blk;        int   done;        char   np[MAXPATH];           strcpy(np,path);        strcat(np,"\\*.*");        printf("==========================================\r\n");   clines();        printf("%s\r\n",   path);                                                                       clines();        printf("------------------------------------------\r\n");   clines();           //遍历本级目录(参数path的目录)        done   =   findfirst(np,   &blk,   FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_ARCH|FA_DIREC);        while(!done   &&   !bQuit)          {              if(blk.ff_attrib&FA_DIREC)   //得到的文件名是目录(文件夹)                {                    //分解文件的各个信息(日期、时间、长度等),显示出来                    printf("%-12s       <dir>       %04d-%02d-%02d   %02d:%02d:%02d\r\n",   blk.ff_name,                            (blk.ff_fdate>>9)+1980,   (blk.ff_fdate>>5)&0x0f,   blk.ff_fdate&0x1f,                            blk.ff_ftime>>11,   (blk.ff_ftime>>5)&0x3f,   (blk.ff_ftime<<1)&0x3f);                }              else   //得到的文件名是文件                {                    //分解文件的各个信息(日期、时间、长度等),显示出来                    printf("%-12s   %9ld   %04d-%02d-%02d   %02d:%02d:%02d\r\n",   blk.ff_name,   blk.ff_fsize,                            (blk.ff_fdate>>9)+1980,   (blk.ff_fdate>>5)&0x0f,   blk.ff_fdate&0x1f,                            blk.ff_ftime>>11,   (blk.ff_ftime>>5)&0x3f,   (blk.ff_ftime<<1)&0x3f);                }              clines();   //计算是否满一屏,如果是,暂停              done   =   findnext(&blk);   //下一个文件          }        #ifdef   __WIN32__        findclose(&blk);   //Windows   32比特版本的编译器要求关闭ffblk                                          //实际是"长文件名"系统要求必须这样做                                          //Windows   95   以后的版本或者NT4.0以后的版本        //如果使用了长文件名系统,在控制台模式运行                                        //的32位程序和控制台下调用了LFN中断的16位程序        #endif           //遍历下一级目录(参数path的下一级)        done   =   findfirst(np,   &blk,   FA_DIREC);        while(!done   &&   !bQuit)          {              //文件名为"."和".."分别表示当前目录和上级目录,不在遍历范围,如果遍历则造成死循环              if((blk.ff_attrib&FA_DIREC)   &&   (strcmp(blk.ff_name,".")   &&   strcmp(blk.ff_name,"..")))                {                    strcpy(np,path);                 //需要遍历的目录名(np)   =   path   +   blk.ff_name                    strcat(np,"\\");                    strcat(np,blk.ff_name);                    dirall(np);                           //遍历下一级目录(np),(递归调用)                }              done   =   findnext(&blk);           //下一个目录          }        #ifdef   __WIN32__        findclose(&blk);   //Windows   版本的编译器要求关闭ffblk        #endif    }       int   main(void)    {        dirall("C:");   //从"C:"节点开始遍历      getch();      return   0;    }  

阅读(7043) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册