2013-04-02 178 views
1

该函数搜索当前目录中的文件。如果它占据一个目录,它将进入并重新搜索除当前'。'之外的文件。和以前的'..'目录。但它不工作,我想如何。它不会进入下一个目录。如何搜索当前目录中的文件和当前目录下目录中的文件?

int foo(char *currDir) 
{ 
    struct dirent *direntp; 
    DIR *dirp; 
    char currentDir[250]; 



    if ((dirp = opendir(currDir)) == NULL) 
    { 
     perror ("Failed to open directory"); 
     return 1; 
    } 

    //By Sabri Mev at GYTE 

    while ((direntp = readdir(dirp)) != NULL) 
    { 
    printf("%s\n", direntp->d_name); 
    if(direntp->d_type == DT_DIR) 
    { 
     if(strcmp(direntp->d_name,".") !=0 && strcmp(direntp->d_name,"..") != 0) 
      foo(direntp->d_name); //Recursive! 
    } 
    } 
    getcwd(currentDir,250); 
    printf("curr Dir : %s\n",currentDir); 


    while ((closedir(dirp) == -1) && (errno == EINTR)) ; 

    return 0; 
} 
+0

你用调试器跟踪了代码吗?它甚至会进入递归部分吗? – Mike

回答

2

因为你的路径是错误的。

试试这个

if(direntp->d_type == DT_DIR) 
{ 
    if(strcmp(direntp->d_name,".") !=0 && strcmp(direntp->d_name,"..") != 0) 
    { 
     sprintf(currentDir, "%s/%s", currDir, direntp->d_name); 
     foo(currentDir); //Recursive! 
    } 
} 
+0

谢谢Scy。它真的很棒。 :) –

0
direntp->d_name你只能访问本地的目录名称

,它不会返回整个路径

getcwd功能已被弃用。改用ISO C++标准_getcwd(如果你用C++编写的话)。

1

当您在循环内对foo()进行递归调用时,请注意direntp-> d_name包含的内容不是完整路径,而只是子目录名称。您必须将它与currDir连接起来,并使用结果调用foo()。例如,如果你以foo(“/ home”)开始,并且第一个子目录是“root”,那么当它应该是foo(“/ home /根”)。