linux下C遍歷文件夾

#include   <stdio.h>
#include   <sys/types.h>
#include   <sys/stat.h>
#include   <dirent.h>
#include   <string.h>
#include   <errno.h>

int   schflag   =   0;
long   ndir,   nfile;

int   isdir(char   *);
void   search(char   *,   char   *);

main(int   argc,   char   **argv)
{
        char   *fname;
        char   cbuf[BUFSIZ];
        char   *cdir;

        ndir   =   nfile   =   0;

        if   (   argc   ==   1)   {
                printf( "Usage:   %s   [path]   file/n ",   argv[0]);
                printf( "/tif   no   path   is   given   as   a   command   line   argument,/n ");
                printf( "/tthe   current   dir   is   set   as   the   default   search   dir./n ");
                exit(0);
        }
       

        if   (   argc   ==   2)   {
                fname   =   argv[1];
                cdir   =   (char   *)   getcwd(cbuf,   BUFSIZ);
        }
        if(   argc   ==   3)   {
                fname   =   argv[2];
                cdir   =   argv[1];
        }

        //printf( "current   dir   is   %s/n ",   cdir);
        search(cdir,   fname);

        if(!schflag)
                printf( "%s:   '%s '   not   found./n ",argv[0],   fname);
        printf( "%ld   file(s)/t%ld   (sub)dir(s)/n ",   nfile,   ndir);
}

int  isdir(char   *name)
{
        struct   stat   stbuf;

        if(   lstat(name,   &stbuf)   <   0)     {
                printf( "stat:   %s   :%s/n ",name,   strerror(errno));
                return   0;
        }
        else
                return   (S_ISDIR(stbuf.st_mode))?   1   :   0   ;
}

void
search(char   *path,   char   *fname)
{
        DIR   *dirp;
        struct   dirent   *dir;
        char   buffer[BUFSIZ];


        if(isdir(path))   {
                if(   (dirp   =   opendir(path))   ==   NULL)   {
                        printf( "Error   opening   dir   %s ",   path);
                        printf( "   :%s/n ",   strerror(errno));
                        return;
                }
        }
        else
                return;

        while(   (dir   =   readdir(dirp))   !=   NULL)   {
           

                if(!strcmp(dir-> d_name,   ". ")   ||   !strcmp(dir-> d_name,   ".. "))

                {   }
                else {
                      bzero(buffer,   sizeof(buffer));
                      strncat(buffer,   path,   sizeof(buffer));
                      if(path[strlen(path)   -   1]   ==   '/ ');
                      else 
                              strncat(buffer,   "/ ",   sizeof(buffer));
                     

                      strncat(buffer,   dir-> d_name,   sizeof(buffer));
               

                      if(isdir(buffer)) { 
                               ndir++;
                               //printf( "%s   is   a   dir./n ",   buffer);
                               search(buffer,   fname);
                      }
                      else   { 
                              nfile++;
        //                    printf( "%s   is   NOT   a   dir./n ",   dir-> d_name);
        //                    printf( "%s/%s/n ",   path,   dir-> d_name); 
                               if(dir-> d_namlen == strlen(fname)   &&   !strcmp(dir-> d_name, fname)) { 
                                       schflag   =   1; 
                                       printf( "/33[01;32mfound:   %s/%s/33[00m/n ",   path,fname); 
                               } 
                      } 
               } 
        } 
        closedir(dirp);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章