Newsgroup: it.comp.lang.c
Titolo: ricerca e apertura file in sottocartelle

dovrei effettuare una ricerca di una stringa di testo all'interno di
alcuni file di testo denominati "chiave.txt" contenuti in una cartella
specificata e nelle rispettive sottocartelle. Ho provato a strimpellare
qualcosa con in vecchio Borland Tc++ sotto dos, ma non ho trovato
comandi specifici (oltre ai soliti findfirst e findnext, i quali però
trovano i files solo in una determinata cartella e non anche in quelle
sottoposte). Eventualmente ho anche la versione DevC++ per windows.
Qualcuno mi potrebbe dare uno spunto per risolvere questo problema?

Qualcuno mi potrebbe dare uno spunto per risolvere questo problema?
Usi FindFirstFile e FindNextFile in un codice ricorsivo simile a
questo (non testato):
#include "windows.h"
#include "stdio.h"
void CercaStoAccidente (char *Path)
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
char p [MAX_PATH];
hFind = FindFirstFile (Path,&FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
   ... gestisci errore ...
while (1)
   {
   // e' una directory?
   if (wfd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
      {
      strcpy (p,wfd.cFileName);
      if (p [0] == '.')
         goto Again;
      strcat (p,"\\*.*");
      CercaStoAccidente (p);
      }
   else   // e' un file
      {
      Controlla se ha trovato un "chiave.txt"
      }
Again:
   if (!FindNextFile (hFl,&wfd))
      {
      FindClose (hFl);
      break;
      }
   }
}
void main ()
{
char Path [MAX_PATH];
strcpy (Path,"C:\\*.*");   // directory di patenza
CercaStoAccidente (Path);
}

...era un po' di tempo che non smanettavo con il c: e il ritorno non
è stato dei più felici. Ho provato a compilare il programma che mi
hai postato, ma ho incontrato degli errori durante la compilazione, in
particolare per quanto riguarda le variabili wfd e hFl. Per sicurezza
ho inserito nella lista delle librerie anche io.h dopo aver verificato
che all'interno di questa libreria compare la variabile wfd. Mi
sapresti dare qualche altro input per fare girare il programmino?

sapresti dare qualche altro input per fare girare il programmino?
Codice corretto e testato:
#include "windows.h"
#include "stdio.h"
void CercaStoAccidente (char *Path)
{
WIN32_FIND_DATA wfd;
HANDLE hFind;
char p [MAX_PATH];
hFind = FindFirstFile (Path,&wfd);
if (hFind == INVALID_HANDLE_VALUE)
   {
   printf ("\nErrore in FindFirstFile");
   return;
   }
while (1)
   {
   // e' una directory?
   if (wfd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
      {
      if (wfd.cFileName [0] == '.')
         goto Again;
 
      strcpy (p,Path);
      p [strlen (p)-3] = '\0';
      strcat (p,wfd.cFileName);
      strcat (p,"\\*.*");
      CercaStoAccidente (p);
      }
   else   // e' un file
      {
      //      Controlla se ha trovato un "chiave.txt"
      strcpy (p,Path);
      p [strlen (p)-3] = '\0';
      strcat (p,wfd.cFileName);
      printf ("\nTrovato file: %s",p);
      }
 
Again:
   if (!FindNextFile (hFind,&wfd))
      {
      FindClose (hFind);
      break;
      }
   }
}
void main ()
{
char Path [MAX_PATH];
strcpy (Path,"C:\\test\\*.*");   // directory di patenza
CercaStoAccidente (Path);
}

       strcat (p,wfd.cFileName);
...ti vedo un po' spericolato, con puntatori e buffer? :-P
ciao :-)
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com