PDA

Visualizza la versione completa : [C] Procedura di navigazione cartelle e file


Alucard.Forum
18-06-2007, 17:07
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.



#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...

Xaratroom
19-06-2007, 23:39
Ciao ...
Vedi se ti può essere utile: l'ho trovato sul sito di dev-cpp un po' di tempo fa:

//
// 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 ...
:ciauz:

Alucard.Forum
20-06-2007, 14:55
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.

Xaratroom
20-06-2007, 16:47
Non so se con la funzione stat del POSIX puoi ottenere anche data di creazione ...
controlla :ciauz:

Loading