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

    [C] Procedura di navigazione cartelle e file

    Ciao a tutti.
    Il problema che deo porvi e’ decisamente incasinato.
    Devo creare una procedura che mi navighi all’interno di una struttura cosi’ definita:
    C’e’ una cartella “dati” che ha al suo interno una serie di cartelle “padre” che a loro volta hanno un tot di cartelle “figlie”.
    Per ogni cartella “padre” dovrei aprire la sola cartella “figlia” che mi corrisponde nella data (di creazione, o di ultima modifica ad es.) al parametro data passato.
    Per ogni “padre” dovro’ quindi aprire una “figlia”.
    Di ogni “figlia” dovrei infine dire quanti file contiene, se vi sono file vuoti, ecc.
    Non riesco a combinare gran che’, a parte questo (che nemmeno funziona)… Ci sto lavorando dalla mattina alla sera, senza fare molti progressi…
    Grazie mille a tutti.
    A presto.

    codice:
    #include <string.h>
    #include <sys/stat.h>
    #include <dirent.h>
    #include <string.h>
    
    
    int main () {
        int padre_n=1, file_counter=0;
        DIR *dati_dir, *padre_dir, *figlia_dir;
        struct dirent *nav_dati, *nav_padre, *nav_figlia;
        struct stat my_file;
        
        dati_dir=opendir("dati");
        if (dati_dir==NULL) {
           printf("Warning: Directory \'dati\' not present!\n");
           return 0;
        }
        
        nav_dati=readdir(dati_dir);
        while (nav_dati!=NULL) {
              padre_dir=opendir(nav_dati->d_name);
              if (padre_dir!=NULL) {
                 printf("padre0%d", padre_n);                
                 nav_padre=readdir(padre_dir);
                 while (nav_padre!=NULL) {
                       figlia_dir=opendir(nav_padre->d_name);
                       if (figlia_dir!=NULL) {
                          nav_figlia=readdir(figlia_dir);
                          while (nav_figlia!=NULL) {
                                stat(nav_figlia->d_name, &my_file);
                                file_counter++;
                                if (my_file.st_size==0)
                                   printf("\tdirectory_contains_some_empty_files\n");
                                nav_figlia=readdir(figlia_dir);
                          }
                          if (file_counter==0)
                             printf("\tdirectory_is_empty_\n");
                          else if (file_counter<4)
                               printf("\tdirectory_contains_too_few_images\n");
                       }
                       else
                           printf("\tdirectory_not_present\n");
                       closedir(figlia_dir);
                       nav_padre=readdir(padre_dir);
                 }
              }
              else
                  printf("Warning: Directory \'padre0%d\' not present!\n", padre_n);
              closedir(padre_dir);
              padre_n++;
              nav_dati=readdir(dati_dir);               
        }                  
        closedir(dati_dir);                        
        
        return 0;
    }
    Questo l'ho fatto generico (apre tutte le "figlie" di ogni "padre") non sapendo appunto come scegliere in base alla data...

    Death in t
    he dream world
    will set your soul
    wa
    ndering for eternity, Demon

  2. #2
    Ciao ...
    Vedi se ti può essere utile: l'ho trovato sul sito di dev-cpp un po' di tempo fa:
    codice:
    //
    //   DirWalk.C
    //
    //   By Ciro Sisman Pereira
    //      CiroSP@aol.com
    //
    
    
    #include <windows.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    void fDirWalk(char *);
    void displayTree(int, char *);
    
    //------------------------------------------------
    void main( int pcount, char *ptext[] )
    //------------------------------------------------
    {
    
       if ( pcount < 2 )
       {
         printf("\\");
         fDirWalk( "\\" );
       }
       else
       {
         printf(ptext[1]);
         fDirWalk( ptext[1] );
       }
    
    }
    
    //------------------------------------------------
    void fDirWalk(char *_current)
    //------------------------------------------------
    {
        char            DirName[MAX_PATH];
        HANDLE          Hnd;
        WIN32_FIND_DATA WFD;
        static int _dlevel = 0;
    
    //  Set the new current directory
        SetCurrentDirectory( _current );
    
    //  Starts the search
        Hnd = FindFirstFile( "*.*", &WFD );
    
    //  loop to get all inside the current directory
        while ( FindNextFile( Hnd, &WFD ) )
        {
    //    If it is a real directory
          if (
               ( WFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) &&
               ( strcmp(WFD.cFileName, "..") && strcmp(WFD.cFileName, ".") )
             )
          {
    //       Get the current directory
             GetCurrentDirectory( MAX_PATH, DirName );
    
    //       Put a "\" if necessary
             if ( strncmp( &DirName[strlen(DirName)-1], "\\", 1 ) )
               (void) strcat( DirName, "\\" );
    
    //       Create a new path
             (void) strcat( DirName, WFD.cFileName );
    
    //       Add 1 to level counter
             _dlevel++;
    
    //       Show the new directory
             displayTree( _dlevel, WFD.cFileName );
    
    //       Make a new call to itself
             fDirWalk( DirName );
    
    //       Go back one level
             SetCurrentDirectory( ".." );
    
    //       Subtracts 1 to level counter
             _dlevel--;
          }
    
        } // End while
    
    // End the search to this call
       (void) FindClose( Hnd );
       return;
    }
    
    //------------------------------------------------
    void displayTree(int _dnumber, char *_dname)
    //------------------------------------------------
    {
    	char _txt[128];
    	int  _c = 0;
    
       (void) memset( _txt, 0x00, sizeof(_txt) );
       (void) memset( _txt, ' ', _dnumber * 3 );
    
       for ( _c = 0; _c < _dnumber * 3; _c+=3 )
    	   _txt[_c] = '|';
    
       _txt[_c-1] = _txt[_c-2] = '_';
    
    	printf("\n%s%s", _txt, _dname );
    	fflush(stdout);
    }
    In parole povere fa il tree ...
    Experience is what you get when you don’t get what you want

  3. #3

    Comincia ad andare...

    Grazie intanto...

    La procedura generica che mi apre tutto cio' che si trova "al di sotto" di 'dati' comincia a dare molto meno problemi...
    Mi apriva in particolare anche le:
    "."
    ".."
    quindi un sacco di cartelle che non c'entravano nulla...

    Resta solo una questione che non so proprio affrontare:
    Come ricavare la data/ora di creazione di una cartella "figlia" cosi' da poter decidere se aprirla o meno?
    Come si gestisce la data/ora?

    Grazie ancora.
    A presto.

    Death in t
    he dream world
    will set your soul
    wa
    ndering for eternity, Demon

  4. #4
    Non so se con la funzione stat del POSIX puoi ottenere anche data di creazione ...
    controlla
    Experience is what you get when you don’t get what you want

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 © 2026 vBulletin Solutions, Inc. All rights reserved.