2015-01-07 49 views
0

我在C递归函数:传递打开目录作为参数

void dir(char *file_name, char *dir_name) { 
    DIR *f=opendir(dir_name); 
    if(f==NULL) 
     perror(dir_name); 
    else { 
     struct dirent *a; 
     while((a=readdir(f))!=NULL) { 
      if(strcmp(a->d_name,".")!=0 && strcmp(a->d_name,"..")!=0 && a->d_type==4) { 
       char s1[250]; 
       strcpy(s1,dir_name); 
       if(s1[strlen(s1)-1]!='/') 
         strcat(s1,"/"); 
       strcat(s1,a->d_name); 
       if(strcmp(a->d_name,file_name)==0) 
       { 
        printf("%s\n",s1); 
        n++; 
       } 
       dir(file_name,s1); 
      } 
      else 
      { 
       if(strcmp(a->d_name,file_name)==0) 
       { 
        n++; 
       } 
      } 
     } 
    closedir(f); 
    } 
} 

其实际作用:它看起来“FILE_NAME”内部“DIR_NAME”及其子文件夹和算怎么可能次“FILE_NAME”出现在该层次结构中。

我简单地称之为main()就像dir(argv[1],argv[2]);(一些C参数“./program_name file_to_find.txt directory”)。

其实一切正常,但我不想打开void dir()内的目录。我希望它在main()中打开,并将其数据作为参数传递给dir()(因此参数char *dir_name)应该被修改。

有没有办法做这样的事情(将打开的目录作为参数传递给函数)?

回答

0

这真的很简单

void dir(DIR *f, char *file_name, char *dir_name) 
{ 
    struct dirent *a; 
    int n = 0; 

    while ((a = readdir(f)) != NULL) 
    { 
     if (strcmp(a->d_name,".") != 0 && strcmp(a->d_name,"..") != 0 && a->d_type == 4) 
     { 
      char s1[250]; 
      DIR *next; 

      strcpy(s1, dir_name); 
      if (s1[strlen(s1) - 1] != '/') 
       strcat(s1, "/"); 
      strcat(s1, a->d_name); 

      if (strcmp(a->d_name, file_name) == 0) 
      { 
       printf("%s\n",s1); 
       n++; 
      } 

      next = opendir(s1); 
      if (next != NULL) 
      { 
       dir(next, file_name, s1); 
       closedir(next); 
      } 
     } 
     else 
     { 
      if (strcmp(a->d_name, file_name) == 0) 
      { 
       n++; 
      } 
     } 
    } 
} 

int main(int argc, char **argv) 
{ 
    DIR *f; 

    if (argc < 3) 
     return -1; 

    f = opendir(argv[2]); 
    if (f != NULL) 
    { 
     dir(f, argv[1], argv[2]); 
     closedir(f); 
    } 
    return 0; 
} 
+0

什么'dir_name'参数?看起来像你不通过'main()' – stefanz

+0

@stefanz确实,它现在工作吗? –

+0

是的,它的工作原理。谢谢。 'dir()'里面的'n'看起来有些问题,因为它是从函数中抛出的,但是暂时没有想到,我在全局中使用它(这是一个小程序,只是这个void和main)。 – stefanz