linux下的文书扫描程序,Linux下C语言遍历文件夹

作者: 操作系统  发布:2019-09-06

 不错,值得借鉴:
平素上代码了,那一个相比便于精通。

学习了Linux下用C语言遍历文件夹,一些感受

原代码有一些难点,何况注释说的path也不确定为全目录,相对目录亦可。

struct dirent中的多少个分子:

修改后在ubuntu 10.10上跑过,没难题。

d_type:4表示为目录,8象征为文件

#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
#include <string>
#include <vector>
#include <iostream>
using namespace std;
 
/***************************************************
*作者   : 潘际勇
*意义   : 扫描目录中负有文件, 并插手strvec中.
*path   : 目录, 全路径. 如/home, /home/
*strvec : 调用前,将strvec置空.strvec将被填充
*再次回到值 : 重返 0, 成功施行; 再次来到 -1, 失利
***************************************************/
int
scan_allfile (const char *path, vector <string> &strvec)
{
  DIR *dp;          //目录流
  struct dirent *entry;     //目录项消息
  struct stat statbuf;
 
//展开目录, 判定目录是不是留存
  if ((dp = opendir (path)) == 0)
    {
      fprintf (stderr, "open dir failedn");
      return -1;
    }
 
//读取目录新闻
  while ((entry = readdir (dp)) != 0)
    {
      //忽略 . ..目录
      if (!strcmp (entry->d_name, ".") || !strcmp (entry->d_name, ".."))
    {
      continue;
    }
 
      //获取扫描到的文本的信息, 如果路线中从未'/', 则加'/', 加入strvec
      //不管是目录,还是文件,都将被加进去.
      //tmp_path是多个全路径
      string tmp_path (path);
      if (*(tmp_path.end () - 1) != '/')
    tmp_path += '/';
      tmp_path += entry->d_name;
      strvec.push_back (tmp_path);
 
      //假若是目录, 递归的扫视
      if (entry->d_type == 4)
    {
      scan_allfile (tmp_path.c_str (), strvec);
    }
      else
    {
      //do nothing
    }
    }
  closedir (dp);
  return 0;
}
 
int
main ()
{
  char *path = new char[255];
  cin >> path;
  vector < string > strvec;
 
  scan_allfile (path, strvec);
 
//输出, 测量试验扫描是或不是科学
  for (vector < string >::iterator iter = strvec.begin ();
       iter != strvec.end (); ++iter)
    cout << *iter << endl;
 
  delete[]path;
  path = 0;
  return 0;
}

d_reclen:16意味子目录或文件,24意味非子目录

作者“風聲”

透过本身亲自试验开采:d_reclen:16表示子目录或以.起先的潜伏文件,24表示平常文书文件,28为二进制文件,等等

直接上代码了,这几个比较便于掌握。 原代码有一点难题,何况注释说的path也不必然为全目录,绝对目录亦可。 修改后在...

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("普通文书:%sn", ent->d_name);
            }
            else
            {
                printf("子目录:%sn",ent->d_name);
                List(ent->d_name);
                printf("返回%sn",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=%dt", 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,地址:

#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   requriedn");  
                                  exit(1);  
                  }  
                  if(lstat(argv[1],   &s)   <   0){  
                                  printf("lstat   errorn");  
                                  exit(2);  
                  }   

                  //推断贰个路子是不是是目录
                  if(!S_ISDIR(s.st_mode)){  
                                  printf("%s   is   not   a   direction   namen",   argv[1]);  
                                  exit(3);  
                  }  
   
                  dir_scan("",   argv[1]);  
   
                  printf("total:   %d   filesn",   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   errorn");  
                  }  
   
                  if(S_ISDIR(s.st_mode)){  
                                  strcpy(dirname+strlen(dirname),   file);  
                                  strcpy(dirname+strlen(dirname),   "/");  
                                  if((dir   =   opendir(file))   ==   NULL){  
                                                  printf("opendir   %s/%s   errorn");  
                                                  exit(4);  
                                  }  
                                  if(chdir(file)   <   0)   {  
                                                  printf("chdir   errorn");  
                                                  exit(5);  
                                  }  
                                  while((dt   =   readdir(dir))   !=   NULL){  
                                                  if(dt->d_name[0]   ==   '.'){  
                                                                  continue;  
                                                  }  
   
                                                  dir_scan(dirname,   dt->d_name);  
                                  }  
                                  if(chdir("..")   <   0){  
                                                  printf("chdir   errorn");  
                                                  exit(6);  
                                  }  
                  }else{  
                                  printf("%s%sn",   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("文件:%sn",pdirent->d_name);
    }
    printf("文件总量%dn",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: %sn ", 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%sn ",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 %sn ",topdir);
         printdir(topdir,0);
         printf( "done.n ");
  
         exit(0);
}


本文由今晚买四不像发布于操作系统,转载请注明出处:linux下的文书扫描程序,Linux下C语言遍历文件夹

关键词: