Lista tree della directory

di il
2 risposte

Lista tree della directory

Salve a tutti... inizio subito con il mio codice:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

typedef enum { false = 0, true }bool;

int j = 0;

bool caricameno_elemnti_lista(const char *t_str)
{

  chdir(t_str);

  DIR *t_dir = NULL;
  char t_buf[20][256];
  int t_i = 0;
  int t_j = 0;
 
  struct dirent *t_pent;
  struct stat t_sta;
 
  if(!(t_dir = opendir("."))){
    printf("opendir() failure; terminating!\n");
    exit(1);
  }

  while(t_pent = readdir(t_dir)){
    //    printf("A -> Aprtura dir name %s\n", t_pent->d_name);
    if(t_pent->d_name[0] != '.'){
      //printf("A -> Aprtura dir name %s\n", t_pent->d_name);
      stat(t_pent->d_name, &t_sta);

      if((S_ISDIR(t_sta.st_mode))){
        printf("%s\n", t_pent->d_name);
        ++j;
        caricameno_elemnti_lista(t_pent->d_name);
        --j;
      }
      else {
        strcpy(t_buf[t_i], t_pent->d_name);
        //g_print("C -> Non è una dir\n");
        ++t_i;
      }
    }
  }

  for(t_j = 0; t_j < t_i; t_j++){
    printf("%s\n", t_buf[t_j]);
  }

  closedir(t_dir);
  chdir("..");
  return false;
}

int main(int argc, char *argv[])
{
  caricameno_elemnti_lista("listafile");
  return 0;
}
Questo programma elenca tutte le directory e le subdirectory "compresi i file" di una data directory...
la domanda è:
Come posso ottenere una stampa nel terminale di tipo ad albero?
esempio:
vorrei che l'output fosse del tipo:

|--mia_dir
|--|--dir1
|--|--|--file
|--|--|--file
|--|--file
|--|--file
|--file
|--file
per quanto ne so, non posso usare nella printf
 "%ns" 
"dove n è un numero di spostamenti....
qualche suggerimento?

2 Risposte

  • Re: Lista tree della directory

    Potresti semplicemente passare un argomento intero alla caricameno_elemnti_lista(): questo parametro, chiamiamolo 'livello' ti indica il livello in cui ti trovi.
    Nella prima chiamata a caricameno_elemnti_lista() passi 0 come livello, mentre nelle chiamate interne passi (livello+1).
    Ora, semplicemente prima di ogni scrittura a video richiami una funzione che riceve in input il livello e in base a questo, con un ciclo for, stampa a video n spazi (ad esempio se vuoi una "tabulazione" di 4 spazi basta che stampa un numero di spazi pari a livello*4).
    Poi, puoi fare cose anche più carine, magari riportando non solo spazi ma anche un carattere di pipe ('|') per dare l'idea di "albero"...
  • Re: Lista tree della directory

    candaluar ha scritto:


    Potresti semplicemente passare un argomento intero alla caricameno_elemnti_lista(): questo parametro, chiamiamolo 'livello' ti indica il livello in cui ti trovi.
    Nella prima chiamata a caricameno_elemnti_lista() passi 0 come livello, mentre nelle chiamate interne passi (livello+1).
    Ora, semplicemente prima di ogni scrittura a video richiami una funzione che riceve in input il livello e in base a questo, con un ciclo for, stampa a video n spazi (ad esempio se vuoi una "tabulazione" di 4 spazi basta che stampa un numero di spazi pari a livello*4).
    Poi, puoi fare cose anche più carine, magari riportando non solo spazi ma anche un carattere di pipe ('|') per dare l'idea di "albero"...
    In effetti è così che sto facendo...
    ti posto il nuovo codice "anche se, ancora devo completarlo" o se qualcuno può darmi altri consigli:
    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
    #include <dirent.h>
    #include <stdlib.h>
    #include <sys/stat.h>
    #include <unistd.h>
    
    typedef enum { false = 0, true }bool;
    
    #define ramo "+--"
    #define trov "+--"
    #define spac "  ¦"
    #define pipe "¦"
    
    int j = 0;
    
    bool caricameno_elemnti_lista(const char *t_str)
    {
      chdir(t_str);
    
      DIR *t_dir = NULL;
      char t_buf[20][256];
      char t_buf1[256];
      char t_buf2[256];
      char t_tmp[256];
      int t_i = 0;
      int t_j = 0;
      int t_al = 0;
    
      struct dirent *t_pent;
      struct stat t_sta;
    
      if(!(t_dir = opendir("."))){
        printf("opendir() failure; terminating!\n");
        exit(1);
      }
    
      if(j == 0){
        strcpy(t_buf1, trov);
      }
      else {
        strcpy(t_buf1, pipe);
        for(t_al = 0; t_al < j; t_al++){
          strcat(t_buf1, spac);
        }
        strcpy(t_buf2, t_buf1);
      }
    
      while(t_pent = readdir(t_dir)){
        //    printf("A -> Aprtura dir name %s\n", t_pent->d_name);
        if(t_pent->d_name[0] != '.'){
          //printf("A -> Aprtura dir name %s\n", t_pent->d_name);
          stat(t_pent->d_name, &t_sta);
    
          if((S_ISDIR(t_sta.st_mode))){
    	if(j != 0) {
    	  strcat(t_buf1, ramo);
    	}
    	printf("%s %s\n", t_buf1, t_pent->d_name);
    	++j;
            caricameno_elemnti_lista(t_pent->d_name);
    	--j;
          }
          else {
    	strcpy(t_buf[t_i], t_pent->d_name);
            //g_print("C -> Non è una dir\n");
            ++t_i;
          }
        }
      }
    
      for(t_j = 0; t_j < t_i; t_j++){
        if(j > 0){
          if(t_j+1 == t_i){
    	strcpy(t_tmp, t_buf2);
    	strcat(t_tmp, ramo);
          }
          else {
    	strcpy(t_tmp, t_buf2);
    	strcat(t_tmp, trov);
          }
          printf("%s %s\n", t_tmp, t_buf[t_j]);
        }
        else {
          if(t_j+1 == t_i){
    	strcpy(t_tmp, ramo);
          }
          else {
    	strcpy(t_tmp, trov);
          }
          printf("%s %s\n", t_tmp, t_buf[t_j]);
        }
      }
      closedir(t_dir);
      chdir("..");
      return false;
    }
    
    int main(int argc, char *argv[])
    {
      if(argv[1] == NULL){
        printf("Eror! no name path\n");
      }
      else {
        caricameno_elemnti_lista(argv[1]);
      }
        return 0;
    }
    
      //printf("t_str = %s\n", t_str);
      /*
      char t_path[1000];
      getcwd(t_path, 1000);
      strcat(t_path, "/");
      strcat(t_path, t_str);
      printf("t_path = %s\n", t_path);
      */
    
    
    cmq, Grazie per la risposta...
Devi accedere o registrarti per scrivere nel forum
2 risposte