Linux下C语言遍历文件夹
学习了LINUX下用C语言遍历文件夹,一些心得
struct dirent中的几个成员:
d_type:4表示为目录,8表示为文件
d_reclen:16表示子目录或文件,24表示非子目录
经过本人亲自试验发现:d_reclen:16表示子目录或以.开头的隐藏文件,24表示普通文本文件,28为二进制文件,等等
d_name:目录或文件的名称
具体代码如下,仅供参考
#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>
void List(char *path)
{
    struct dirent* ent = NULL;
    DIR *pDir;
    pDir=opendir(path);
    while (NULL != (ent=readdir(pDir)))
    {
        if (ent->d_reclen==24)
        {
            if (ent->d_type==8)
            {
                printf("普通文件:%s\n", ent->d_name);
            }
            else
            {
                printf("子目录:%s\n",ent->d_name);
                List(ent->d_name);
                printf("返回%s\n",ent->d_name);
            }
        }
    }
}
int main(int argc, char *argv[])
{
     List(argv[1]);
     return 0;
}
上面函数修改后:
void List(char *path)
{
    printf("路径为[%s]\n", path);
    
    struct dirent* ent = NULL;
    DIR *pDir;
    pDir=opendir(path);
    //d_reclen:16表示子目录或以.开头的隐藏文件,24表示普通文本文件,28为二进制文件,还有其他……
    while (NULL != (ent=readdir(pDir)))
    {
        printf("reclen=%d    type=%d\t", ent->d_reclen, ent->d_type);
        if (ent->d_reclen==24)
        {    
            //d_type:4表示为目录,8表示为文件
            if (ent->d_type==8)
            {
                printf("普通文件[%s]\n", ent->d_name);
            }
        }
        else if(ent->d_reclen==16)
        {
            printf("[.]开头的子目录或隐藏文件[%s]\n",ent->d_name);
        }
        else
        {
            printf("其他文件[%s]\n", ent->d_name);
        }
    }
}
转CU,地址:
http://blog.chinaunix.net/u/29024/showart_484896.html
#include   <stdio.h>   
#include   <dirent.h>   
#include   <sys/types.h>   
#include   <sys/stat.h>   
    
void dir_scan(char   *path,   char   *file);   
int count = 0;   
    
int main(int   argc,   char   *argv[])   
{   
                  struct   stat   s;   
    
                  if(argc   !=   2){   
                                  printf("one   direction   requried\n");   
                                  exit(1);   
                  }   
                  if(lstat(argv[1],   &s)   <   0){   
                                  printf("lstat   error\n");   
                                  exit(2);   
                  }   
                  //判断一个路径是否是目录
                  if(!S_ISDIR(s.st_mode)){   
                                  printf("%s   is   not   a   direction   name\n",   argv[1]);   
                                  exit(3);   
                  }   
    
                  dir_scan("",   argv[1]);   
    
                  printf("total:   %d   files\n",   count);   
    
                  exit(0);   
}   
    
void   dir_scan(char   *path,   char   *file)   
{   
                  struct   stat   s;   
                  DIR           *dir;   
                  struct   dirent   *dt;   
                  char   dirname[50];   
    
                  memset(dirname,   0,   50*sizeof(char));   
                  strcpy(dirname,   path);   
    
                  if(lstat(file,   &s)   <   0){   
                                  printf("lstat   error\n");   
                  }   
    
                  if(S_ISDIR(s.st_mode)){   
                                  strcpy(dirname+strlen(dirname),   file);   
                                  strcpy(dirname+strlen(dirname),   "/");   
                                  if((dir   =   opendir(file))   ==   NULL){   
                                                  printf("opendir   %s/%s   error\n");   
                                                  exit(4);   
                                  }   
                                  if(chdir(file)   <   0)   {   
                                                  printf("chdir   error\n");   
                                                  exit(5);   
                                  }   
                                  while((dt   =   readdir(dir))   !=   NULL){   
                                                  if(dt->d_name[0]   ==   '.'){   
                                                                  continue;   
                                                  }   
    
                                                  dir_scan(dirname,   dt->d_name);   
                                  }   
                                  if(chdir("..")   <   0){   
                                                  printf("chdir   error\n");   
                                                  exit(6);   
                                  }   
                  }else{   
                                  printf("%s%s\n",   dirname,   file);   
                                  count++;   
                  }   
}
linux c 下如何获得目录下的文件数目。
int main(int argc, char **argv)
{    
     DIR  * pdir;
    struct dirent * pdirent;
    struct stat f_ftime;
    int fcnt;/*文件数目统计*/
     pdir=opendir("./");
    if(pdir==NULL)
    {      return(-1);    }
     fcnt=0;
    for(pdirent=readdir(pdir);pdirent!=NULL;pdirent=readdir(pdir))
    {
      if(strcmp(pdirent->d_name,".")==0||strcmp(pdirent->d_name,"..")==0) continue;
      if(stat(pdirent->d_name,&f_ftime)!=0) return -1 ;
      if(S_ISDIR(f_ftime.st_mode)) continue; /*子目录跳过*/
       fcnt++;  
      printf("文件:%s\n",pdirent->d_name);
    }
    printf("文件总数%d\n",fcnt);
     closedir(pdir);
    return 0; 
}
#include <unistd.h>  
#include <stdio.h>  
#include <dirent.h>  
#include <string.h>  
#include <sys/stat.h>  
  
void printdir(char *dir, int depth) 
{ 
         DIR *dp; 
         struct dirent *entry; 
         struct stat statbuf; 
  
         if((dp = opendir(dir)) == NULL) { 
                     fprintf(stderr, "cannot open directory: %s\n ", dir); 
                     return; 
         } 
         chdir(dir); 
         while((entry = readdir(dp)) != NULL) { 
                     lstat(entry-> d_name,&statbuf); 
                     if(S_ISDIR(statbuf.st_mode)) { 
                                 /**//* Found a directory, but ignore . and .. */ 
                                 if(strcmp( ". ",entry-> d_name) == 0 || 
                                             strcmp( ".. ",entry-> d_name) == 0) 
                                             continue; 
                                 printf( "%*s%s/\n ",depth, " ",entry-> d_name); 
                                 /**//* Recurse at a new indent level */ 
                                 printdir(entry-> d_name,depth+4); 
                     } 
                     else printf( "%*s%s\n ",depth, " ",entry-> d_name); 
         } 
         chdir( ".. "); 
         closedir(dp); 
} 
  
/**//*    Now we move onto the main function.    */ 
  
int main(int argc, char* argv[]) 
{ 
         char *topdir, pwd[2]= ". "; 
         if (argc != 2) 
                     topdir=pwd; 
         else 
                     topdir=argv[1]; 
  
         printf( "Directory scan of %s\n ",topdir); 
         printdir(topdir,0); 
         printf( "done.\n "); 
  
         exit(0); 
}
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号