Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C] Ricorsione per la navigazione in sottocartelle

    Salve, ho fatto quest'esercizio in C che dovrebbe girare su sistemi di tipo unix, la traccia è nel codice.
    All'apparenza da i risultati richiesti, ma vi è un bug che non riesco a capire.

    Nella parte della funzione cerca_ext, che è una funzione che cerca i file che terminano con .ext in tutte le sottodirectory della directory passata da linea di comando, se è presente un file in una sottodirectory terminante per .ext da segmentation fault, altrimenti se non è presente le cartelle sono analizzate corretemente e l'esercizio da i risultati corretti.

    Ora esaminando l'output delle printf, sembra che venga vista come cartella un file terminante con .ext se presente nelle sottodirectory, e non capisco perchè, essendoci un if che controlla SE il file in analisi è una directory.
    Qualcuno nella ricorsione non va insomma.

    Qualcuno ha qualche idea? Grazie 1000

    codice:
    /* Scrivere un programma Trovafile.c che quando invocato con Trovafile ext directory trovi
    * tutti i file a partire dalla directory di nome directory che hanno come estensione ext
    * e ne verifichi i diritti di lettura per altri e le dimensioni. Individuato il file di
    * dimensione minima, il programma deve creare un file con lo stesso nome e con estensione
    * txt nella directory corrente in cui scrivere i nome dei file. */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <errno.h>
    #include <dirent.h>
    #include <sys/stat.h>
    #include <string.h>
    #include <fcntl.h>
    #include <limits.h>
    
    
    /* Struttura contenente le informazione da raccogliere */
    struct info_da_salvare {
      char *nome_file;
      off_t size;
      int permesso;
    } array_file_ext[100];  
    int contatore = 0;
    
    /* Prototipi funzioni */
    void cerca_ext (char *path);
    int main(int argc, char *argv[])
    {
      /* Dichiarazione delle variabili */
      int i, len_da_copiare;
      off_t size_minimo= INT_MAX;
      char *file_minimo;
      char new_path[256];
      int fd;
      
      /* Controllo input */
      if (argc != 3) {
        printf("Usage %s ext <path>\n", argv[0]);
        exit(1);  
      }
      
      /* Chiamata funzione su directory passata */
      cerca_ext(argv[2]);
      
      /* Ora ho tutti i dati che mi servono nell'array della struttura, stampo i dati e
      faccio la ricerca del size minimo */
      for (i=0; i<contatore; i++){
        printf("File %s, peso %d, permesso %d\n", array_file_ext[i].nome_file, array_file_ext[i].size, array_file_ext[i].permesso); 
        if (array_file_ext[i].size < size_minimo)
          size_minimo = array_file_ext[i].size;
        file_minimo = array_file_ext[i].nome_file;
      } 
      printf("Ho trovato %d file terminanti per exc\n", contatore);
      printf("Quello che pesa meno e' %s, che pesa %d\n", file_minimo, size_minimo);
      
      /* Creo il nome del nuovo file txt che conterra' i nome dei file .ext tramite
      manipolazioni sulle stringhe */
      len_da_copiare = strlen(file_minimo)-4;
      strncpy(new_path, file_minimo, len_da_copiare);
      new_path[len_da_copiare]='\0';
      strcat(new_path, ".txt");
      
      /* Creo un nuovo file */
      fd = creat (new_path, 0744);
      
      /* Scrittura nel file */
      for (i=0; i<contatore; i++){
        write (fd, array_file_ext[i].nome_file, sizeof(char)*strlen(array_file_ext[i].nome_file));
        write (fd, &"\n", sizeof(char));
      }
      
      /* Chiusura descrittore e uscita */
      close(fd);
      exit(0);
    } 
    
    void cerca_ext (char *path) { 
      /* Dichiarazione delle variabili */
      DIR *directory;
      struct dirent *file;
      struct stat info_file;
      char newpath[256], *ptr;
      char cwd[256];
      int mask=4;          //Permessi in lettura altri
      
      /* Apro directory e me la salvo in newpath*/
      directory = opendir (path);
      strcpy (newpath, path);
      
      /* Finche' la directory ha file, li scorro per vedere se terminano con .ext */
      while (((file = readdir (directory))) != NULL){
        stat (file -> d_name, &info_file);    //Cerco informazioni stat
        
        /* Se e' una directory, devo aprirla e cercare all'interno, uso ricorsione */
        if (S_ISDIR(info_file.st_mode)) {
          if ((strncmp(file -> d_name, ".", 1))!=0) {
    	/* Creo il nome del nuovo percorso sui cui fare la ricorsione */
    	strcat (newpath, "/");
    	strcat (newpath, file -> d_name);
    	printf("new cartella: %s\n", newpath);
    	cerca_ext(newpath);
          }
        }
        /* Se sono qui non è una directory il file che sto esaminando */
        else {
          if ((ptr = strstr(file->d_name, ".ext")) != NULL) {  //Impreciso, trova prima occ
    	/* Stampo percorso del file e salvo i dati di mio interesse */ 
    	getcwd(cwd, sizeof(cwd));
    	printf("Ho trovato 1 file, %s/%s\n", cwd, file->d_name);
    	array_file_ext[contatore].nome_file = file->d_name;
    	array_file_ext[contatore].size = info_file.st_size;
    	/* Confronto sui bit, se il permesso c'è salvera' 1, altrimenti 0 */
    	if ((info_file.st_mode & S_IROTH) == mask)
    	  array_file_ext[contatore].permesso = 1;
    	else
    	  array_file_ext[contatore].permesso = 0;
    	contatore++;
          }     
        }  
      }
      closedir(directory);
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Ci sono un po' di bug... innanzitutto ti consiglio di azzerare esplicitamente i byte della struttura info_file nel ciclo while della funzione, scrivendo come ultima istruzione del ciclo

    memset((void *) &info_file, 0, sizeof(info_file));

    perché utilizzando sempre la stessa struct alcuni byte rimangono sporchi e ad un certo punto la funzione viene richiamata ricorsivamente anche su file che non sono directory, quindi crolla l'unverso dopo un po'.

    Considera anche un fatto molto carino: supponi che in una certa "cartella1" il programma trovi un'altra cartella "cartella2": per come lo hai scritto tu, richiami la funzione ricorsivamente su questa directory concatenando il suo nome al path, quindi passi alla funzione

    cartella1/cartella2

    ora questa directory viene esaminata, dopodiché termina la chiamata ricorsiva e riprende l'analisi della directory precedente "cartella1". Nel caso il programma ne trovi un'altra, "cartella3", rifai la stessa procedura, ma qui sta il problema: in "newpath" adesso hai "cartella1/cartella2", non più "cartella1", perché l'hai modificato in precedenza, quindi quando vai a fare la concatenazione non ottieni "cartella1/cartella3" come dovrebbe essere ma "cartella1/cartella2/cartella3", e automaticamente muore tutto (perché quella directory non esiste e la opendir fallisce).

    Il consiglio è di rivedere pesantemente la logica del programma, tra l'altro ci sono altre cose come

    codice:
    	for (i = 0; i < contatore; i++) {
    		write (fd, array_file_ext[i].nome_file, sizeof(char)*strlen(array_file_ext[i].nome_file));
    		write (fd, &"\n", sizeof(char));
    	}
    una stringa costante viene già trattata come un indirizzo, non si deve utilizzare l'operatore & :D

    Tra l'altro, perché costringi l'utente a passare "ext" al programma se questo è un parametro fisso?
    every day above ground is a good one

  3. #3
    Grande enzo, ho capito l'errore, ho lasciato proprio perdere la ricorsione, ho cambiato la logica.
    Ora in un array chiamato elenco_directory_da_leggere salvo i nomi di tutte le directory che incontro.
    Quando finisco di leggere tutti i file di una directory, passo a leggere la prossima. Ogni volta che trovo una nuova directory aumento rimanenze, ogni volta che finisco di leggere, lo abbasso di 1.

    Le stringhe delle directory sono giuste, resta il problema che vede i file .ext delle sottocartelle come cartelle, quindi prova a leggerci come se fossero cartelle e da segmentation fault.
    Anche se ho messo l'istruzione memset che dovrebbe pulire, in teoria.

    Mi trovo, posto anche altri 3 dubbi :P

    1 ) ho usato una malloc nel ciclo per avere ogni volta un newpath pulito, ma era meglio una calloc o indifferente?
    2 ) Se un folle avesse un file sul pc chiamato aaaaa.ext.ssd.ext (assurdo lo so) siccome strstr ritorna la prima occorrenza, il codice sarebbe buggato. A me serve l'ultima occorrenza in realta', il buon java (e qui ti arrabbierai) ha la funzione per l'ultima occorrenza. Del C non l'ho trovata.
    3 ) Ho usato solo una free alla fine, basta quella o dovrei usarne altre su tutto cio' che ho dichiarato come puntatore?

    Grazie

    Dimenticavo il codice
    codice:
    /* Scrivere un programma Trovafile.c che quando invocato con Trovafile ext directory trovi
    * tutti i file a partire dalla directory di nome directory che hanno come estensione ext
    * e ne verifichi i diritti di lettura per altri e le dimensioni. Individuato il file di
    * dimensione minima, il programma deve creare un file con lo stesso nome e con estensione
    * txt nella directory corrente in cui scrivere i nome dei file. */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <errno.h>
    #include <dirent.h>
    #include <sys/stat.h>
    #include <string.h>
    #include <fcntl.h>
    #include <limits.h>
    
    
    /* Struttura contenente le informazione da raccogliere */
    struct info_da_salvare {
      char *nome_file;
      off_t size;
      int permesso;
    } array_file_ext[100];  
    int contatore = 0;
    
    /* Prototipi funzioni */
    void cerca_ext (char *path);
    int main(int argc, char *argv[])
    {
      /* Dichiarazione delle variabili */
      int i, len_da_copiare;
      off_t size_minimo= INT_MAX;
      char *file_minimo;
      char new_path[256];
      int fd;
      
      /* Controllo input */
      if (argc != 3) {
        printf("Usage %s ext <path>\n", argv[0]);
        exit(1);  
      }
      
      /* Chiamata funzione su directory passata */
      cerca_ext(argv[2]);
      
      /* Ora ho tutti i dati che mi servono nell'array della struttura, stampo i dati e
      faccio la ricerca del size minimo */
      for (i=0; i<contatore; i++){
        printf("File %s, peso %d, permesso %d\n", array_file_ext[i].nome_file, array_file_ext[i].size, array_file_ext[i].permesso); 
        if (array_file_ext[i].size < size_minimo)
          size_minimo = array_file_ext[i].size;
        file_minimo = array_file_ext[i].nome_file;
      } 
      printf("Ho trovato %d file terminanti per exc\n", contatore);
      printf("Quello che pesa meno e' %s, che pesa %d\n", file_minimo, size_minimo);
      
      /* Creo il nome del nuovo file txt che conterra' i nome dei file .ext tramite
      manipolazioni sulle stringhe */
      len_da_copiare = strlen(file_minimo)-4;
      strncpy(new_path, file_minimo, len_da_copiare);
      new_path[len_da_copiare]='\0';
      strcat(new_path, ".txt");
      
      /* Creo un nuovo file */
      fd = creat (new_path, 0744);
      
      /* Scrittura nel file */
      for (i=0; i<contatore; i++){
        write (fd, array_file_ext[i].nome_file, sizeof(char)*strlen(array_file_ext[i].nome_file));
        write (fd, "\n", sizeof(char));
      }
      
      /* Chiusura descrittore e uscita */
      close(fd);
      exit(0);
    } 
    
    void cerca_ext (char *path) { 
      /* Dichiarazione delle variabili */
      DIR *directory;
      struct dirent *file;
      struct stat info_file;
      char *newpath, *ptr;
      char cwd[256];
      int mask=4;          //Permessi in lettura altri
      int rimanenza = 0;
      char elenco_directory_da_leggere[256][256]; //Il primo 256 sono le massime cartelle, il secondo il numero di caratteri
      int contatore_directory_da_leggere = 0;
      int prossimo_da_leggere = 0;
      
      strcpy (elenco_directory_da_leggere[0], path);
     
      do {
      // Apro directory e me la salvo in newpath
      directory = opendir (elenco_directory_da_leggere[prossimo_da_leggere]);  
      printf("\nSto leggendo in: %s\n", elenco_directory_da_leggere[prossimo_da_leggere]);
      
      // Finche' la directory ha file, li scorro per vedere se terminano con .ext
      while (((file = readdir (directory))) != NULL){
        stat (file -> d_name, &info_file);    //Cerco informazioni stat
    
        // Se e' una directory, devo aprirla e cercare all'interno, uso ricorsione
        if (S_ISDIR(info_file.st_mode)) {
          if ((strncmp(file -> d_name, ".", 1))!=0) {
    	// Creo il nome del nuovo percorso sui cui fare la ricorsione
    	newpath = (char *) malloc (256*sizeof(char));     //dubbio
    	strcpy (newpath, getcwd(cwd, sizeof(cwd)));
    	strcat (newpath, "/");
    	strcat (newpath, file -> d_name);
    	printf("Trovata dire: %s\n", newpath);
    	contatore_directory_da_leggere++;
    	rimanenza++;
    	strcpy (elenco_directory_da_leggere[contatore_directory_da_leggere], newpath);
          }
        }
        // Se sono qui non è una directory il file che sto esaminando
        else {
          if ((ptr = strstr(file->d_name, ".ext")) != NULL) {  //Impreciso, trova prima occ
    	// Stampo percorso del file e salvo i dati di mio interesse
    	getcwd(cwd, sizeof(cwd));
    	printf("Trovato file: %s/%s\n", cwd, file->d_name);
    	array_file_ext[contatore].nome_file = file->d_name;
    	array_file_ext[contatore].size = info_file.st_size;
    	// Confronto sui bit, se il permesso c'è salvera' 1, altrimenti 0 
    	if ((info_file.st_mode & S_IROTH) == mask)
    	  array_file_ext[contatore].permesso = 1;
    	else
    	  array_file_ext[contatore].permesso = 0;
    	contatore++;
          }     
        }  
      }
      // Qui ci arrivo quando ho letto tutti i file contenuti in una directory
      prossimo_da_leggere++;
      rimanenza--;
      
      // Pulizia info_file e chiusura directory 
      memset((void *) &info_file, 0, sizeof(info_file));
      closedir(directory);
      }   
      while (rimanenza > 0);
      free(newpath);
    }
    Esercizio da 6 punti un corno

    EDIT: Faccio passare all'utente ext perchè la traccia chiede esplicitamente quell'input, in effetti potrei anche aggiungere un controllo sull'effettiva corretta immissione. E' inutile ma la traccia è sempre la traccia

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    E da dove comincio? :°D

    Allora innanzitutto la memset() la non va bene:

    codice:
    while (((file = readdir (directory))) != NULL){
        stat (file -> d_name, &info_file);    //Cerco informazioni stat
    
        // Se e' una directory, devo aprirla e cercare all'interno, uso ricorsione
        if (S_ISDIR(info_file.st_mode)) {
          if ((strncmp(file -> d_name, ".", 1))!=0) {
    	// Creo il nome del nuovo percorso sui cui fare la ricorsione
    	newpath = (char *) malloc (256*sizeof(char));     //dubbio
    	strcpy (newpath, getcwd(cwd, sizeof(cwd)));
    	strcat (newpath, "/");
    	strcat (newpath, file -> d_name);
    	printf("Trovata dire: %s\n", newpath);
    	contatore_directory_da_leggere++;
    	rimanenza++;
    	strcpy (elenco_directory_da_leggere[contatore_directory_da_leggere], newpath);
          }
        }
        // Se sono qui non è una directory il file che sto esaminando
        else {
          if ((ptr = strstr(file->d_name, ".ext")) != NULL) {  //Impreciso, trova prima occ
    	// Stampo percorso del file e salvo i dati di mio interesse
    	getcwd(cwd, sizeof(cwd));
    	printf("Trovato file: %s/%s\n", cwd, file->d_name);
    	array_file_ext[contatore].nome_file = file->d_name;
    	array_file_ext[contatore].size = info_file.st_size;
    	// Confronto sui bit, se il permesso c'è salvera' 1, altrimenti 0 
    	if ((info_file.st_mode & S_IROTH) == mask)
    	  array_file_ext[contatore].permesso = 1;
    	else
    	  array_file_ext[contatore].permesso = 0;
    	contatore++;
          }     
        }
      memset((void *) &info_file, 0, sizeof(info_file));
      }
    così non dovrebbe dare problemi, tra l'altro per come lo avevi scritto effettivamente ottenevo anche io un segmentation fault su file che non sono directory.

    Poi

    1 ) ho usato una malloc nel ciclo per avere ogni volta un newpath pulito, ma era meglio una calloc o indifferente?
    non ho controllato tutto il codice perché è... non so come dire :D comunque una calloc semplicemente azzera esplicitamente lo spazio allocato nel segmento heap, la malloc() non lo fa. Vedi se ti serve l'azzeramento...

    2 ) Se un folle avesse un file sul pc chiamato aaaaa.ext.ssd.ext (assurdo lo so) siccome strstr ritorna la prima occorrenza, il codice sarebbe buggato. A me serve l'ultima occorrenza in realta', il buon java (e qui ti arrabbierai) ha la funzione per l'ultima occorrenza. Del C non l'ho trovata.
    probabilmente anche il C ha qualcosa del genere, ma in questo momento non mi viene nulla di fine. strrchr() (con due r) ad esempio restituisce il puntatore all'ultimo carattere specificato, ma prova a dare un'occhiata a tutta la libreria string, oppure puoi fare qualcosa del genere (supponendo che "stringa" sia appunto la stringa da controllare)

    codice:
    if (strlen(stringa) >= 4) {
            if (strncmp(stringa + strlen(stringa) - 4, ".ext", 4) == 0) {
                    printf("Questa stringa termina con .ext, e non ho usato Java!!\n");
            }
    }
    3 ) Ho usato solo una free alla fine, basta quella o dovrei usarne altre su tutto cio' che ho dichiarato come puntatore?
    la free() va richiamata su ogni puntatore per il quale è stata allocata memoria dinamicamente (e solo una volta), non in altri casi. Sarebbe anche buona norma annullare il puntatore con

    nome_puntatore = NULL;

    dopo aver richiamato la free(), per evitare che altre free() accidentali sullo stesso puntatore facciano crashare il programma (free() su un puntatore NULL invece non ha effetto).
    every day above ground is a good one

  5. #5
    Niente, con lo spostamento di memset va un po meglio (i file non dire non sono piu' visti come dire) ma non va comunque. Ho stampato i campi st_mode di ogni file per vedere il loro valore, per la directory principale va bene, a partire dalla primasottodirectory no. Alcuni hanno valore 0, penso dato dalla memset, il valore, passando per la stat, dovrebbe cambiare, ma a volte non cambia.

    Questo poi porta un bug avanti che fa salvare file non .ext nella struttura info_da_salvare con relativo segmentation fault successivo.

    Cosa manca ancora?
    Ho spostato anche rimanenza, prima non andava bene

    P.s. La tua strncmp funziona, ma non l'ho capita, me la spieghi?
    tnx


    codice:
    /* Scrivere un programma Trovafile.c che quando invocato con Trovafile ext directory trovi
    * tutti i file a partire dalla directory di nome directory che hanno come estensione ext
    * e ne verifichi i diritti di lettura per altri e le dimensioni. Individuato il file di
    * dimensione minima, il programma deve creare un file con lo stesso nome e con estensione
    * txt nella directory corrente in cui scrivere i nome dei file. */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <errno.h>
    #include <dirent.h>
    #include <sys/stat.h>
    #include <string.h>
    #include <fcntl.h>
    #include <limits.h>
    
    
    /* Struttura contenente le informazione da raccogliere */
    struct info_da_salvare {
      char *nome_file;
      off_t size;
      int permesso;
    } array_file_ext[100];  
    int contatore = 0;
    
    /* Prototipi funzioni */
    void cerca_ext (char *path);
    int main(int argc, char *argv[])
    {
      /* Dichiarazione delle variabili */
      int i, len_da_copiare;
      off_t size_minimo= INT_MAX;
      char *file_minimo;
      char new_path[256];
      int fd;
      
      /* Controllo input */
      if (argc != 3) {
        printf("Usage %s ext <path>\n", argv[0]);
        exit(1);  
      }
      
      /* Chiamata funzione su directory passata */
      cerca_ext(argv[2]);
      
      /* Ora ho tutti i dati che mi servono nell'array della struttura, stampo i dati e
      faccio la ricerca del size minimo */
      for (i=0; i<contatore; i++){
        printf("File %s, peso %d, permesso %d\n", array_file_ext[i].nome_file, array_file_ext[i].size, array_file_ext[i].permesso); 
        if (array_file_ext[i].size < size_minimo)
          size_minimo = array_file_ext[i].size;
        file_minimo = array_file_ext[i].nome_file;
      } 
      printf("Ho trovato %d file terminanti per exc\n", contatore);
      printf("Quello che pesa meno e' %s, che pesa %d\n", file_minimo, size_minimo);
      
      /* Creo il nome del nuovo file txt che conterra' i nome dei file .ext tramite
      manipolazioni sulle stringhe */
      len_da_copiare = strlen(file_minimo)-4;
      strncpy(new_path, file_minimo, len_da_copiare);
      new_path[len_da_copiare]='\0';
      strcat(new_path, ".txt");
      
      /* Creo un nuovo file */
      fd = creat (new_path, 0744);
      
      /* Scrittura nel file */
      for (i=0; i<contatore; i++){
        write (fd, array_file_ext[i].nome_file, sizeof(char)*strlen(array_file_ext[i].nome_file));
        write (fd, "\n", sizeof(char));
      }
      
      /* Chiusura descrittore e uscita */
      close(fd);
      exit(0);
    } 
    
    void cerca_ext (char *path) { 
      /* Dichiarazione delle variabili */
      DIR *directory;
      struct dirent *file;
      struct stat info_file;
      char *newpath, *ptr;
      char cwd[256];
      int mask=4;          //Permessi in lettura altri
      int rimanenza = 1;
      char elenco_directory_da_leggere[256][256]; //Il primo 256 sono le massime cartelle, il secondo il numero di caratteri
      int contatore_directory_da_leggere = 0;
      int prossimo_da_leggere = 0;
      
      strcpy (elenco_directory_da_leggere[0], path);
      
      do {
        // Apro directory e me la salvo in newpath
        directory = opendir (elenco_directory_da_leggere[prossimo_da_leggere]);  
        printf("\nSto leggendo in: %s\n", elenco_directory_da_leggere[prossimo_da_leggere]);
        rimanenza--;
        
        // Finche' la directory ha file, li scorro per vedere se terminano con .ext
        while (((file = readdir (directory))) != NULL){
          
          stat (file -> d_name, &info_file);    //Cerco informazioni stat
          printf("%s %d\n", file ->d_name, info_file.st_mode);
          
          // Se e' una directory, devo aprirla e cercare all'interno, uso ricorsione
          if (S_ISDIR(info_file.st_mode)) {
    	if ((strncmp(file -> d_name, ".", 1))!=0) {  //Elimina . e ..
    	  // Creo il nome del nuovo percorso sui cui fare la ricorsione
    	  newpath = (char *) malloc (256*sizeof(char));
    	  strcpy (newpath, getcwd(cwd, sizeof(cwd)));
    	  strcat (newpath, "/");
    	  strcat (newpath, file -> d_name);
    	  printf("Trovata dire: %s\n", newpath);
    	  contatore_directory_da_leggere++;
    	  rimanenza++;
    	  strcpy (elenco_directory_da_leggere[contatore_directory_da_leggere], newpath);
    	}
          }
          // Se sono qui non è una directory il file che sto esaminando
          else {
    	//if ((ptr = strstr(file->d_name, ".ext")) != NULL) {  //Impreciso, trova prima occ
    	 if (strlen(file -> d_name) >= 4) {
               if (strncmp(file -> d_name + strlen(file -> d_name) - 4, ".ext", 4) == 0) {
    
    	  // Stampo percorso del file e salvo i dati di mio interesse
    	  getcwd(cwd, sizeof(cwd));
    	  printf("Trovato file: %s/%s\n", cwd, file->d_name);
    	  array_file_ext[contatore].nome_file = file->d_name;
    	  array_file_ext[contatore].size = info_file.st_size;
    	  // Confronto sui bit, se il permesso c'è salvera' 1, altrimenti 0 
    	  if ((info_file.st_mode & S_IROTH) == mask)
    	    array_file_ext[contatore].permesso = 1;
    	  else
    	    array_file_ext[contatore].permesso = 0;
    	  contatore++;
    	  }     
    	}     
          }  
          // Pulizia info_file e chiusura directory 
          memset((void *) &info_file, 0, sizeof(info_file));
        }
        // Qui ci arrivo quando ho letto tutti i file contenuti in una directory
        prossimo_da_leggere++;
        closedir(directory);
        printf("Rimanenza %d\n", rimanenza);
      }   
      while (rimanenza > 0);
      newpath = NULL;
      free(newpath);
    }

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    In tutta sincerità non mi viene la voglia di debugare tutto quel codice senza che ci sia un problema specifico da risolvere, ti suggerivo un paio di attenzioni (come il fatto di memset()) per evitare crash dovuti a dati sporchi, ma per il resto non so... piuttosto preferisco riscriverlo da 0, se proprio ti serve :°D

    P.s. La tua strncmp funziona, ma non l'ho capita, me la spieghi?
    Se la stringa ha almeno 4 caratteri (se ne ha di meno, non potrebbe mai terminare in ".ext") allora in sostanza confronti i suoi ultimi 4 caratteri con ".ext".

    "stringa + strlen(stringa) - 4" è il puntatore all'ultima sottostringa di 4 caratteri, questo perché all'indirizzo di base prima sommi la lunghezza della stringa (e arrivo alla fine) e poi sottraggo 4. Il terzo parametro della funzione indica il numero di caratteri che voglio confrontare. In quel caso praticamente non serve, ma in generale è meglio ricorrere alle funzioni safe della libreria string (strncmp, strncpy...) per evitare problemi di buffer overflow.
    every day above ground is a good one

  7. #7
    e vabbuo' ci fermiamo qui

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.