PROBLEMA ricerca ricorsiva in directory e subdirectory,C

Pubblicità

Qwert999

Nuovo Utente
Messaggi
10
Reazioni
0
Punteggio
26
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]);

}
}
 
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?
 
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]);

}
}
 
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/...
 
Tra l’altro c’è un grosso errore di memory leak in quel codice (nella funzione scrivi che essendo chiamata ricorsivamente ha conseguenze catastrofiche.
 
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?
--- i due messaggi sono stati uniti ---
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"?
 
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:
Pubblicità
Pubblicità
Indietro
Top