Oppure

Loading
23/07/08 19:05
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:
#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: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 23/07/08 19:14
27/07/08 19:34
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...
27/07/08 20:36
gantonio
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 ...

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 27/07/08 20:38
aaa
27/07/08 20:41
grazie antonio,
domani guardo... per la sezione è perchè so solo il c++ quindi non mi ero accorto fosse solo in C!!!!!!!
grazie ciap
28/07/08 9:03
grazie antonio!!!
l'esempio l'ho capito ma avrei 2 domande:
-1 mi spieghi questa riga???
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:
   cout<<"Inserire il percorso in effettuare la
   ricerca:  ";
   cin>>percorso;

   search(cosa metto qua???);
   


grazie e ciao!!!

:k::k::k:
28/07/08 9:12
gantonio
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);
aaa
28/07/08 9:44
si ma a quel punto dovrei inizializzare la variabile percorso cosi:
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???
28/07/08 9:48
gantonio
Postato originariamente da mattyfog:
si ma a quel punto dovrei inizializzare la variabile percorso cosi:
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];

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