ls -R 的递归实现

ls -R 的递归实现

LinuxC文件操作 递归 动态数组


之前对递归和动态数组用的不是很多,可能理解已不是很深 
这一次实现ls -R的递归刚好巩固了自己的薄弱点 
下面主要是重新梳理一下之前的逻辑 
不说说了,先放码:

void display_dir(int flag,char*name)

{
DIR * dir;
struct dirent  *ptr;
int     i,count = 0;
struct stat buf;
char name_dir[10000];
if(chdir(name)<0)                              //将输入的目录改为当前目录,下面操作的前提
{
  my_err("chdir",__LINE__);
}
if(getcwd(name_dir,10000)<0){
  my_err("getcwd",__LINE__);                   //获取当前目录的绝对路径(重要,下面的打开目录的操作需要这个路径,否则需要手动添加)
}
 printf("%s:\n",name_dir);

 dir = opendir(name_dir);     //用新获得的路径打开目录
if(dir==NULL){
  my_err("opendir",__LINE__);
}
while((ptr = readdir(dir))!=NULL){
  if(f_maxlen<strlen(ptr->d_name))
         f_maxlen = strlen(ptr->d_name);
    count++;
}
closedir(dir);

//动态数组
  char**filenames =(char**)malloc(count*sizeof(char*));    //要进行初始化 
  memset(filenames,0,sizeof(char*)*count);

for(i=0;i<count;i++){

  filenames[i]=(char*)malloc(256*sizeof(char));
  memset(filenames[i],0,sizeof(char)*256);
}


int j,len=strlen(name_dir);
dir = opendir(name_dir);
for(i=0;i<count;i++){
    ptr = readdir(dir);
    if(ptr == NULL){
      my_err("readdir",__LINE__);
    }

    strcat(filenames[i],ptr->d_name);    //这里要注意用之前的初始化
}
for(i=0;i<count;i++)
   display_file(flag,filenames[i]);
  printf("\n");
  if(flag>3){                         //递归实现核心部分

      for(i=0;i<count;i++){

          if(lstat(filenames[i],&buf)==-1)
          {
             my_err("stat",__LINE__);
          }
          if(strcmp(filenames[i],"..")==0)
          continue;
          if(strcmp(filenames[i],".")==0)
          continue;
          if(S_ISDIR(buf.st_mode)){
            display_dir(flag,filenames[i]);
          }
          else if(!S_ISDIR(buf.st_mode))
           {
             continue;
           }
               chdir("../");          //处理完一个目录后返回上一层
        }

    }
    for(i=0;i<count;i++)
    {
      free(filenames[i]);
    }
    free(filenames);
    closedir(dir);          //在函数开始时打开,结束时关闭
    }

猜你喜欢

转载自blog.csdn.net/DownloadV/article/details/81276126
ls
今日推荐