Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problema visualizzare i file in una directory
Forum - C/C++ - Problema visualizzare i file in una directory

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
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++

  1. #include <windows.h>
  2. #include <stdio.h>
  3.  
  4. void search()
  5. {
  6.   WIN32_FIND_DATA ricerca;
  7.   HANDLE h;
  8.  
  9.   // Apre la ricerca
  10.   h = FindFirstFile("*.*", &ricerca);
  11.   if (h != INVALID_HANDLE_VALUE)
  12.   {
  13.     // Prosegue la ricerca
  14.     do
  15.            if (GetFileAttributes(ricerca.cFileName) == FILE_ATTRIBUTE_DIRECTORY)
  16.                  {printf ("Cartella: %s\n", ricerca.cFileName);
  17.                   search();}
  18.            else
  19.                  printf ("File: %s\n", ricerca.cFileName);
  20.     while (FindNextFile(h, &ricerca));
  21.         // Chiude la ricerca
  22.         FindClose(h);
  23.   }
  24.   else
  25.   {
  26.     printf("Errore %d\n", GetLastError ());
  27.   }
  28.  
  29. }
  30.  
  31. int main(){
  32.  
  33.   search();
  34.  
  35.   system("pause");
  36. }


ciao e grazie a tutti:k:
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
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 21:34
Domenica, 27/07/2008
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...

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 22:36
Domenica, 27/07/2008
Testo quotato

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++

  1. void search(char *p)
  2. {
  3.   WIN32_FIND_DATA fd;
  4.  
  5.   char pf[MAX_PATH];
  6.   strcpy(pf, p);
  7.   strcat(pf, "\\*.*");
  8.  
  9.   HANDLE h = FindFirstFile(pf, &fd);
  10.   if (h != INVALID_HANDLE_VALUE)
  11.   {
  12.     do
  13.     {
  14.       if( strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, ".."))
  15.       {
  16.         if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  17.         {
  18.           printf ("[%s]\n", fd.cFileName);
  19.  
  20.           char pf[MAX_PATH];
  21.           strcpy(pf, p);
  22.           strcat(pf, "\\");
  23.           strcat(pf, fd.cFileName);
  24.  
  25.           search(pf);
  26.         }
  27.         else
  28.           printf ("\t%s\n", fd.cFileName);
  29.       }
  30.     } while (FindNextFile(h, &fd));
  31.  
  32.     FindClose(h);
  33.   }
  34.   else
  35.     printf("Errore %d\n", GetLastError ());
  36. }
  37.  
  38. int main()
  39. {
  40.   search("C:\\Foto");
  41.  
  42.   system("pause");
  43. }


Ultima modifica effettuata da gantonio il 27/07/2008 alle 22:38
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 22:41
Domenica, 27/07/2008
grazie antonio,
domani guardo... per la sezione è perchè so solo il c++ quindi non mi ero accorto fosse solo in C!!!!!!!
grazie ciap

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 11:03
Lunedì, 28/07/2008
grazie antonio!!!
l'esempio l'ho capito ma avrei 2 domande:
-1 mi spieghi questa riga???
  
Codice sorgente - presumibilmente Plain Text

  1. if( strcmp(fd.cFileName, ".") && strcmp
  2.   (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++

  1. cout<<"Inserire il percorso in effettuare la
  2.    ricerca:  ";
  3.    cin>>percorso;
  4.  
  5.    search(cosa metto qua???);



grazie e ciao!!!
  
  :k::k::k:

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 11:12
Lunedì, 28/07/2008
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);

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 11:44
Lunedì, 28/07/2008
si ma a quel punto dovrei inizializzare la variabile percorso cosi:
Codice sorgente - presumibilmente C/C++

  1. char *percorso;


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???

PM Quote
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 11:48
Lunedì, 28/07/2008
Testo quotato

Postato originariamente da mattyfog:
si ma a quel punto dovrei inizializzare la variabile percorso cosi:
Codice sorgente - presumibilmente C/C++

  1. char *percorso;


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];

Testo quotato


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.

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 12:05
Lunedì, 28/07/2008
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...

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo