Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Explorer ricorsivo
Forum - C/C++ - Explorer ricorsivo

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
WARRIOR (Ex-Member)
Guru


Messaggi: 627
Iscritto: 30/03/2007

Segnala al moderatore
Postato alle 18:16
Sabato, 05/04/2008
Ciao Ragazzi!
Sto implementando una soluzione ricorsiva per attraversare tutto l'hard disk con le API.
Qualcuno che ha già esperienza con queste due funzioni (FindFirstFile(), FindNextFile()), può consigliarmi qualcosa?

Codice sorgente - presumibilmente C#

  1. void cerca(const char *p) {
  2.       string n;
  3.       WIN32_FIND_DATA FindFileData;
  4.       HANDLE hFind;
  5.       vector <string> v;
  6.      
  7.       hFind = FindFirstFile(p,&FindFileData);  
  8.      
  9.       if (INVALID_HANDLE_VALUE != hFind )
  10.       MessageBox(0,"Handle recuperato","handle",0);
  11.       else
  12.       MessageBox(0,"Handle non recuperato","handle",0);  
  13.            
  14.        while(FindNextFile(hFind,&FindFileData)) {
  15.        n=(string)p+"\\"+(string)FindFileData.cFileName;
  16.        if(FindFileData.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY) v.push_back(n);
  17.        else { cout << "nome: " << FindFileData.cFileName; system("pause"); }
  18.        
  19.        }
  20.        
  21.        for(int i=0; i<v.size(); i++) {
  22.                cerca(v[i].c_str());
  23.        }  
  24. FindClose (hFind);
  25. return;
  26. }



Anche senza funzione ricorsiva, provando la funzione FindFirstFile e FindNextFile in sequenza, lo script non va.
Dopo aver preso l'handle al primo file non passa a quello dopo e quest'ultimo esiste. 8-|

Grazie

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 12:24
Lunedì, 07/04/2008
Ma tu come chiami la funzione cerca?


PM Quote
Avatar
WARRIOR (Ex-Member)
Guru


Messaggi: 627
Iscritto: 30/03/2007

Segnala al moderatore
Postato alle 21:28
Lunedì, 07/04/2008
Beh, naturalmente dal Main() passandoci un percorso valido. (quest'ultimo risulta corretto).

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 11:16
Venerdì, 11/04/2008
Abbi pazienza ... cerco di darti una mano ... ho capito che chiami la funzione nel main ...

Mi fai vedere il codice del main in cui chiami la funzione ... ?

PM Quote
Avatar
WARRIOR (Ex-Member)
Guru


Messaggi: 627
Iscritto: 30/03/2007

Segnala al moderatore
Postato alle 10:46
Domenica, 13/04/2008
Codice sorgente - presumibilmente C/C++

  1. main() {
  2. string Path("C:");
  3. cerca(Path.c_str());
  4. return 0;      
  5. }



Questo è il codice del main().
Non penso ci siano errori, anche perché è tutto molto semplice e lineare, tuttavia si ostina a non funzionare.
Grazie per la risposta, fammi sapere :k:.

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 11:00
Domenica, 13/04/2008
Postato originariamente da WARRIOR:
Non penso ci siano errori

... e invece uno c'e' ... ecco perche' ti chiedevo il main ... Deve essere

string Path("C:\\*.*");

A parte questo, ti accorgerai che anche nella funzione cerca ci sono errori (di tipo logico) ... ma lascio a te il piacere di scoprirli e correggerli ...

Ultima modifica effettuata da gantonio il 13/04/2008 alle 11:01
PM Quote
Avatar
WARRIOR (Ex-Member)
Guru


Messaggi: 627
Iscritto: 30/03/2007

Segnala al moderatore
Postato alle 20:16
Lunedì, 14/04/2008
Grazie per la risposta.
Mi spieghi la semantica di quella stringa? (C:\\*.*)...

Grazie ancora
:k:

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 23:45
Lunedì, 14/04/2008
Cosa non capisci ...?

E' il classico

C:\*.*

del DOS ... non lo conosci?

PM Quote
Avatar
WARRIOR (Ex-Member)
Guru


Messaggi: 627
Iscritto: 30/03/2007

Segnala al moderatore
Postato alle 9:52
Venerdì, 18/04/2008
Corretti errori di tipo logico.
Quello che non capisco è questo.
Se all'inizio passo la stringa "C:", il programma recupera l'handle senza problemi, stessa cosa con "C:\\*.*".
Se all'inizio passo la stringa "C:\\WINDOWS\\*.*", il programma prosegue come prima e arrivati alla cartella successiva si ferma. Nell esempio precedente dove passo la stringa "C:\\*.*" ad un certo punto la funzione richiama se stessa con "C:\\WINDOWS\\*.*" e qui si blocca comunque, è questo che non capisco.
Anche passando solo '*' per ricevere tutto incondizionatamente dall'estensione non va...

Ultima modifica effettuata da WARRIOR il 19/04/2008 alle 12:39
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo