Recursive search for files in directories

Asked

Viewed 803 times

1

I have a function that searches file passed by parameter in directories using C language on Linux, I am able to enter the subdirectories and do the search, but when finishing the files in the subdirectory I can’t go back to the previous directory and continue the search.

   int buscaArquivo(char *arquivo, char *diretorio){
   dir = opendir(diretorio);
   if(dir==NULL){
       printf("\n não foi possivel abrir o diretorio %s", diretorio);
       return -1;
   }
   finito = 0;
   do{
       entry = readdir(dir);
       if(entry == NULL){
          printf("\nfim do diretorio");
          closedir(dir);
          finito = 1;

       }else{
           char entrada[PATH_MAX];
           snprintf(entrada,sizeof(entrada),"%s/%s",
                  diretorio, entry->d_name);
           if(entry->d_type == 4){
           //    printf("\n%s",entry->d_name);

           }

           if(strcmp(entry->d_name,arquivo)== 0) //compara nome do arquivo
             printf("\n%s/%s\n", diretorio,arquivo); // achou

           if( (strcmp(".",entry->d_name)) && (strcmp("..",entry->d_name)) && (entry->d_type == 4) ){
               printf("\nentrou no dir %s",entry->d_name);
               buscaArquivo(arquivo,entrada);
           }
       }

   }while(finito == 0);
   return 0;
}

2 answers

1

The command return search function File already does this...and apparently your code is correct. I just reformatted to get more to my liking, but it’s working.

#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <string.h>

int buscaArquivo(char *arquivo, char *diretorio)
{
   char entrada[PATH_MAX];
   struct dirent* entry;

   printf("abrindo diretorio %s\n", diretorio);
   DIR* dir = opendir(diretorio);

   if (dir == NULL)
   {
      printf("não foi possivel abrir o diretorio %s\n", diretorio);
      return -1;
   }

   for (;;)
   {
       entry = readdir(dir);
       if (entry == NULL)
       {
          printf("fim do diretorio %s\n", diretorio);
          closedir(dir);
          break;
       }

       snprintf(entrada,sizeof(entrada),"%s/%s", diretorio, entry->d_name);
       if (entry->d_type == 4)
       {
          printf("(diretorio %s)\n",entry->d_name);
       }

       if (strcmp(entry->d_name,arquivo) == 0)
          printf("encontrou arquico: %s/%s\n", diretorio,arquivo);

       if ((strcmp(".",entry->d_name)) && (strcmp("..",entry->d_name))
          && (entry->d_type == 4))
       {
           printf("entrou no dir %s\n",entry->d_name);
           buscaArquivo(arquivo,entrada);
       }
   }

   return 0;
}

int main()
{

buscaArquivo("aaa", "bbb");

}

1

As it was said that it was in linux, I can’t resist remembering that C allows us to take advantage of the operating system (=a little cheating ). Using popen:

#include <stdio.h>
#include <string.h>

int buscaArquivo(char *arquivo, char *diretorio){
   char com[200],entrada[200];
   sprintf(com,"find '%s' | grep '/%s$'", diretorio, arquivo);
   FILE* f = popen(com,"r");
   while(fgets(entrada,200,f)){
      printf("--> %s",entrada);
   }
   pclose(f);
}

int main(int argc, char* argv[]){
  if(argc == 3) buscaArquivo(argv[1],argv[2]);
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.