()
Newbie
Messaggi:
Iscritto:
|
Ciao a tutti,
ho trovato su internet un esempio su come usare i comandi findfirstfile, findnextfile. findclose e l'ho modificato per poter visualizzare i file anche nelle sotto directory solo che al posto che visualizzare i file e le cartelle visualizza all'infinito
Cartella: ..
File: .
qual'è l'errore???
ecco il codice:
Codice sorgente - presumibilmente C++ |
#include <windows.h> #include <stdio.h> void search() { WIN32_FIND_DATA ricerca; HANDLE h; // Apre la ricerca h = FindFirstFile("*.*", &ricerca); if (h != INVALID_HANDLE_VALUE) { // Prosegue la ricerca do if (GetFileAttributes(ricerca.cFileName) == FILE_ATTRIBUTE_DIRECTORY) {printf ("Cartella: %s\n", ricerca.cFileName); search();} else printf ("File: %s\n", ricerca.cFileName); while (FindNextFile(h, &ricerca)); // Chiude la ricerca FindClose(h); } else { printf("Errore %d\n", GetLastError ()); } } int main(){ search(); system("pause"); }
|
ciao e grazie a tutti
ps: l'errore è dovuto alla funzione ricorsiva (si dice cos se non mi sbaglio) ossia alla chiamata della funzione search all'interno della funzione stessa search.
Ultima modifica effettuata da il 23/07/2008 alle 21:14 |
|
()
Newbie
Messaggi:
Iscritto:
|
c'è qualcuno???
ditemi soltanto come impostare la directory in cui effettuare la ricerca.
grazie ciao
ps: per la ricerca io uso le api findfirstfile, findnextfile, ecc...
|
|
gantonio (Normal User)
Guru^2
Messaggi: 1532
Iscritto: 09/09/2007
|
Postato originariamente da mattyfog:
ditemi soltanto ... |
Ecco il tuo codice corretto ... le correzioni sono semplici ... fammi sapere se hai problemi ...
Non ho capito perche' hai postato in C++ e non in C dato che usi solamente codice C ...
Codice sorgente - presumibilmente C++ |
void search(char *p) { WIN32_FIND_DATA fd; char pf[MAX_PATH]; strcpy(pf, p); strcat(pf, "\\*.*"); HANDLE h = FindFirstFile(pf, &fd); if (h != INVALID_HANDLE_VALUE) { do { if( strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..")) { if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { printf ("[%s]\n", fd.cFileName); char pf[MAX_PATH]; strcpy(pf, p); strcat(pf, "\\"); strcat(pf, fd.cFileName); search(pf); } else printf ("\t%s\n", fd.cFileName); } } while (FindNextFile(h, &fd)); FindClose(h); } else printf("Errore %d\n", GetLastError ()); } int main() { search("C:\\Foto"); system("pause"); }
|
Ultima modifica effettuata da gantonio il 27/07/2008 alle 22:38 |
|
()
Newbie
Messaggi:
Iscritto:
|
grazie antonio,
domani guardo... per la sezione è perchè so solo il c++ quindi non mi ero accorto fosse solo in C!!!!!!!
grazie ciap
|
|
()
Newbie
Messaggi:
Iscritto:
|
grazie antonio!!!
l'esempio l'ho capito ma avrei 2 domande:
-1 mi spieghi questa riga???
Codice sorgente - presumibilmente Plain Text |
if( strcmp(fd.cFileName, ".") && strcmp
(fd.cFileName, ".."))
|
voglio dire: ma i file iniziano con . o .. ???
-2 come faccio a fare in modo che l'utente possa
scegliere la cartella???
esempio:
Codice sorgente - presumibilmente C/C++ |
cout<<"Inserire il percorso in effettuare la
ricerca: ";
cin>>percorso;
search(cosa metto qua???);
|
|
|
gantonio (Normal User)
Guru^2
Messaggi: 1532
Iscritto: 09/09/2007
|
Come saprai, il DOS ha due cartelle speciali (. e ..) che sono semplici riferimenti alla cartella attuale e alla cartella padre, e queste cartelle vanno ignorate durante la scansione.
Il parametro della search e' la cartella da cui inizia la ricerca, come ti avevo mostrato nell'esempio
search("C:\\Foto");
Se tu hai una variabile in cui inserisci il percorso, e' ovvio che devi usare la variabile
search(percorso);
|
|
()
Newbie
Messaggi:
Iscritto:
|
si ma a quel punto dovrei inizializzare la variabile percorso cosi:
Codice sorgente - presumibilmente C/C++ |
e ciò genererebbe un errore nel programma...
quindi???
grazie ciao
ps: già che ci sono mi sai dire se esiste un comando tipo strcpy o strcat ma che invece di copiare o aggiungere possa togliere un tot di carattero???
|
|
gantonio (Normal User)
Guru^2
Messaggi: 1532
Iscritto: 09/09/2007
|
Postato originariamente da mattyfog:
si ma a quel punto dovrei inizializzare la variabile percorso cosi:
Codice sorgente - presumibilmente C/C++ |
e ciò genererebbe un errore nel programma...
|
Scusa matty, ma tu le basi del C le hai?
Perche' quello che hai appena scritto farebbe presupporre di no ...
Se vuoi usare un puntatore per una stringa, devi allocare lo spazio prima di usarla (con la malloc ...), altrimenti usi un vettore di char gia' allocato ...
char percorso[MAX_PATH];
ps: già che ci sono mi sai dire se esiste un comando tipo strcpy o strcat ma che invece di copiare o aggiungere possa togliere un tot di carattero??? |
No ... devi lavorare con la strcpy e la realloc ... a meno che tu non lavori in C++ e usi il dato string. |
|
()
Newbie
Messaggi:
Iscritto:
|
allora mi sai dire come faccio ad ottenere la lunghezza di una variabile char???
io pensavo di ottenerla e poi, siccome voglio togliere gli ultimi 3 caratteri di usare la realloc() e impostare una dimensione minore di 3...
si può fare??? perchè ho solo cercato di dare una guardatina veloce alla realloc...
|
|