2015-01-07 57 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