PROBLEMA ricerca ricorsiva in directory e subdirectory,C

Qwert999

Nuovo Utente
9
0
ciao a tutti , sto facendo un programma che cerca ricorsivamente i file con una certa estensione contenuti in una directory che viene passata dal terminale...il problema che ho è che la ricerca di un dato file si arresta nella cartella che gli viene passata , non trovando altri file in eventuali subdirectory...come posso fare ?
ps se notate altri errori dite pure!



C:
#include<stdio.h>
#include<sys/stat.h>
#include<errno.h>
#include<stdlib.h>
#include<dirent.h>   
#include<stdarg.h>
#include<limits.h>
#include<string.h>
#include<time.h>

void ricor1(const char estensione[],const char nomedirectory[]){

struct stat attr;
char dbuf[PATH_MAX+1];
DIR * fh ;//puntatore ad una struttura DIR
struct dirent *fdata;
struct stat buf;
if((fh=opendir(nomedirectory))==NULL){
perror("ERRORE 1");
exit(errno);
}
puts("\nElenco directory:\n");

while((fdata = readdir (fh))!=NULL){

if(strstr(fdata->d_name,estensione)){

realpath(fdata->d_name,dbuf);

printf("[%s]",dbuf);

stat(nomedirectory,&attr);
printf("%s\n",ctime(&attr.st_mtime));
}

}

}     

 
void ricor2(const char estensione[]){

struct stat attr;
char dbuf[PATH_MAX+1];
DIR * fh ;//puntatore ad una struttura DIR
struct dirent *fdata;
struct stat buf;

if((fh=opendir("./"))==NULL){
perror("ERRORE 1");
exit(errno);
}


while((fdata = readdir (fh))!=NULL){

if(strstr(fdata->d_name,estensione)){

realpath(fdata->d_name,dbuf);

printf("[%s]",dbuf);

stat("./",&attr);
printf("%s\n",ctime(&attr.st_mtime));
}

}

}




int main(int argc, char *argv[])
{
  
 

  if(argc==3){
    
            printf("Controllo esistenza directory.. \n");
            
             DIR* dir=opendir(argv[2]);
            
          if(dir){
                   ricor1(argv[1],argv[2]);
    } else if (ENOENT==errno){

        printf("La directory passata non esiste");
  }
   else{
        
   printf("altro errore"); }   }
    
      
else if(argc==2){


ricor2(argv[1]);

}
}
 

pabloski

Utente Èlite
2,868
916
il problema che ho è che la ricerca di un dato file si arresta nella cartella che gli viene passata , non trovando altri file in eventuali subdirectory

Forse perchè tu non hai minimamente implementato tutta la parte in cui cerca le subdirectory e chiama ricorsivamente la funzione?
 

Qwert999

Nuovo Utente
9
0
ok....ho provato a farlo ma c'è qualche problema....la ricerca avviene nella directory e subdirectory correttamente ma quando gli chiedo di stampare il path assoluto di un file in una subdirectory mi stampa ad esempio :
/home/ciccio/prova.txt ....invece che ....../home/ciccio/dir/subdir/prova.txt


C:
#include<stdio.h>
#include<sys/stat.h>
#include<errno.h>
#include<stdlib.h>
#include<dirent.h>   
#include<stdarg.h>
#include<limits.h>
#include<string.h>
#include<time.h>


char * percorso;

////////////
char * scrivi(const char * a, char * b)
{

char *targetdir = malloc(2048);
strcpy(targetdir,a);
strcat(targetdir,"/");
strcat(targetdir,b);

//printf("%s \n", targetdir);
return targetdir;
}
//////////////


void ricor1(const char estensione[],const char nomedirectory[]){
    
struct stat attr;
char dbuf[PATH_MAX+1];
DIR * fh ;//puntatore ad una struttura DIR


struct dirent *fdata;

struct stat buf;
if((fh=opendir(nomedirectory))==NULL){
perror("ERRORE 1");
exit(errno);
}


while((fdata = readdir (fh))!=NULL){


if(strcmp(fdata->d_name,".")==0)
{
  continue;
}
if(strcmp(fdata->d_name,"..") ==0)
{
continue;
}
if(fdata->d_type==DT_DIR)
{
 { percorso=scrivi(nomedirectory,fdata->d_name);
   ricor1(estensione,percorso);
 }
}
 
//
//


if(strstr(fdata->d_name,estensione)){

realpath(fdata->d_name,dbuf);

printf("[%s]",dbuf);

stat(nomedirectory,&attr);

printf("%s\n",ctime(&attr.st_mtime));
}

}

}     

 
void ricor2(const char estensione[]){

struct stat attr;
char dbuf[PATH_MAX+1];
DIR * fh ;//puntatore ad una struttura DIR
struct dirent *fdata;
struct stat buf;

if((fh=opendir("./"))==NULL){
perror("ERRORE 1");
exit(errno);
}


while((fdata = readdir (fh))!=NULL){

if(strstr(fdata->d_name,estensione)){

realpath(fdata->d_name,dbuf);

printf("[%s]",dbuf);

stat("./",&attr);

printf("%s\n",ctime(&attr.st_mtime));
}

}

}




int main(int argc, char *argv[])
{
  
 

  if(argc==3){
    
            printf("Controllo esistenza directory.. \n");
            
             DIR* dir=opendir(argv[2]);
            
          if(dir){
                   ricor1(argv[1],argv[2]);
    } else if (ENOENT==errno){

        printf("La directory passata non esiste");
  }
   else{
        
   printf("altro errore"); }   }
    
      
else if(argc==2){


ricor2(argv[1]);

}
}
 

pabloski

Utente Èlite
2,868
916
ok....ho provato a farlo ma c'è qualche problema....la ricerca avviene nella directory e subdirectory correttamente ma quando gli chiedo di stampare il path assoluto di un file in una subdirectory mi stampa ad esempio :
/home/ciccio/prova.txt ....invece che ....../home/ciccio/dir/subdir/prova.txt

E' naturale. Tu passi solo il nome del file alla funzione realpath, la quale parte dalla working directory e risolve il path passato.

Ma quello che tu gli passi, non contiene da nessuna parte dir/subdir/...
 
  • Mi piace
Reazioni: Andretti60

Andretti60

Utente Èlite
6,440
5,091
Tra l’altro c’è un grosso errore di memory leak in quel codice (nella funzione scrivi che essendo chiamata ricorsivamente ha conseguenze catastrofiche.
 

Qwert999

Nuovo Utente
9
0
E' naturale. Tu passi solo il nome del file alla funzione realpath, la quale parte dalla working directory e risolve il path passato.

Ma quello che tu gli passi, non contiene da nessuna parte dir/subdir/...
quindi gli dovrei passare il path della directory che dò al terminale giusto?
Post unito automaticamente:

Tra l’altro c’è un grosso errore di memory leak in quel codice (nella funzione scrivi che essendo chiamata ricorsivamente ha conseguenze catastrofiche.
come posso "aggiustarlo"?
 

pabloski

Utente Èlite
2,868
916
quindi gli dovrei passare il path della directory che dò al terminale giusto?

No, quello è l'unico di cui non ha bisogno, visto che si tratta della working directory ( la directory in cui ti trova quando lanci il programma ).

Ma le subdirectory devono comparire nel path, altrimenti lui che ne sa che path vuoi risolvere?

p.s. una cosa importante, se stai programmando sotto Linux, usa il man per leggere le specifiche e il funzionamento delle varie funzioni che stai utilizzando.
 
Ultima modifica:
  • Mi piace
Reazioni: Qwert999

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!