Newsgroup: it.comp.programmare.win32
Titolo: FindFirstFile e C/C++....

Chi mi corregge questa funzione C/C++ che dovrebbe stampare a video la
lista dei files trovati in una determinata directory e che utilizza
come criterio di ricerca l'estensione dei file stessi?
Grazie!
//------------------------------------------------------------------
// trova tutti i files presenti in una directory
// supporta i caratteri wild cards (es *.txt)
// ext deve essere l'estensione da cercare, la path
//------------------------------------------------------------------
void FindFiles(char* path, char* ext)
{
char * file= malloc(300);
char * stringa = calloc (strlen(path) + 7, 1); // è la stringa di
//ricerca
LPWIN32_FIND_DATA lpdata=malloc(sizeof(WIN32_FIND_DATA));
int ret=1;
HANDLE hfile;
lpdata->dwFileAttributes=FILE_ATTRIBUTE_NORMAL;
if(path[strlen(path)-1)!='\\')strcat(path,"\\");
strcpy(file,path);
strcat(stringa, path);
strcat(stringa, ext);
	hfile=FindFirstFile(stringa, lpdata);
	strcat(file, lpdata->cFileName);
	printf("Elaborazione File <%s> in corso..\n", file);
	strcpy(file,path);
while (ret=FindNextFile(hfile,lpdata)!=0)
	{
	strcat(file, lpdata->cFileName);
	printf("Elaborazione File <%s> in corso..\n", file);
	strcpy(file,path);
	}
free(path); free(ext); free(stringa);
FindClose(hfile);free(lpdata); free(file);
}

 }
#include <windows.h>
#include <malloc.h>
#include <stdio.h>
void FindFiles(char* path, char* ext);
int main(int argc, char* argv[])
{
   if(argc > 2)
      if(strlen(argv[1]))
         FindFiles(argv[1], argv[2]);
   return 0;
}
//------------------------------------------------------------------
// trova tutti i files presenti in una directory
// supporta i caratteri wild cards (es *.txt)
// ext deve essere l'estensione da cercare, la path
//------------------------------------------------------------------
void FindFiles(char* path, char* ext)
{
   if(NULL == path || NULL == ext ||
      0 == strlen(path) || 0 == strlen(ext))
   {
      printf("Parametri errati.\n");
      return;
   }
  char localPath[300] = {'\0'};
  char* file = (char*)malloc(300);
   strcpy(localPath, path);
// (1) Perche' calloc di strlen(path) + 7 ??
//
//  if(strlen(ext) > 6)
//       CASINO;
// -------------------------------------
  char* stringa = (char*)calloc (strlen(path) + strlen(ext) +1, 1); // e'
la stringa di
// ricerca
  LPWIN32_FIND_DATA lpdata =
(WIN32_FIND_DATA*)malloc(sizeof(WIN32_FIND_DATA));
  int ret=1;
  HANDLE hfile;
  lpdata->dwFileAttributes=FILE_ATTRIBUTE_NORMAL;
// Spero volessi scrivere path[strlen(path)-1]
// altrimenti l'istruzione non avrebbe molto senso.
// Inoltre, chi ti assicura che path abbia spazio a
// sufficienza perche' gli venga appeso un carattere?
// se quanto allocato per path e' 18 caratteri  e al
// suo interno e' contenuto la stringa "c:/winnt/system32"
// che (magia, magia) e' di 17 caratteri (piu' il
// terminatore) l'aggiunta di "//" va a corrompere memoria
// non allocata per path. Se "path" ed "ext" sono allocate
// una di seguito all'altra il nuovo terminatore di "path"
// cancella "ext" e tanti saluti per per il risultato di
// FindFirstFile() (E' accaduto a me durante il debug del
// programma). Se quanto arriva dall'esterno puo' essere
// modificato, e' molto piu' sicuro usare un buffer
// locale (statico o allocato dinamicamente).
// -------------------------------------------------------
   if(localPath[strlen(localPath) -1] != '\\')
      strcat(localPath, "\\");
  strcpy(file, localPath);
  strcat(stringa, localPath);
  strcat(stringa, ext);   // vedi nota (1)
        hfile=FindFirstFile(stringa, lpdata);
        strcat(file, lpdata->cFileName);
        printf("Elaborazione File <%s> in corso..\n", file);
        strcpy(file,localPath);
   while (ret=FindNextFile(hfile,lpdata)!=0)
   {
      strcat(file, lpdata->cFileName);
      printf("Elaborazione File <%s> in corso..\n", file);
      strcpy(file,localPath);
   }
// Liberazione della memoria
// -------------------------
   free(path);  // path ed ext ti vengono passate dal_
   free(ext);   // l'esterno e, a mio avviso una fun_
                // zione non dovrebbe deallocare un
                // puntatore che gli viene passato (a
                // meno che sia stata scritta appo_
                // sitamente per questo scopo); non e'
                // molto sicuro.
   free(stringa);
   FindClose(hfile);
   free(lpdata);
   free(file);
} // End FindFiles
Il codice percedente ha funzionato e non mi ha dato errori, ma non vi ho
dedicato molto tempo.
Fammi sapere.
Ciao Angelo.