Prog. FindFirstFile plante

Résolu
jejefull1234 Messages postés 8 Date d'inscription dimanche 6 mars 2011 Statut Membre Dernière intervention 15 mars 2011 - 14 mars 2011 à 21:17
jejefull1234 Messages postés 8 Date d'inscription dimanche 6 mars 2011 Statut Membre Dernière intervention 15 mars 2011 - 15 mars 2011 à 15:38
Bonjour,
J'ai réaliser un programme qui affiche la date de création d'un fichier .txt
Le problème c'est que mon code fonctionne en debug mais plante en exécution console.

int main(int argc, char *argv[])
{
    HANDLE Fct1;
    WIN32_FIND_DATA(x);
    LPCTSTR Dossier = "C:\\Users\\...\\history\\essai\\*.*";
    char* i;

    Fct1 = FindFirstFile(Dossier, &x);

    if(Fct1 == INVALID_HANDLE_VALUE)
    {
        printf("Erreur de listing");
    }
    else
    {
            printf("*** Affichage date fichier txt *** : \n\n");

        do
        {
             char repert[100]="C:\\Users\\...\\history\\essai\";

             i = strstr(x.cFileName,".txt");    // cherche les fichiers .txt

             if( i != NULL)                     // Si ce sont des fichier texte faire ...
             {
                    strcat(repert,x.cFileName);            // chemin + nom de  fichier


                   DateFile(repert);     // Fonction qui récupère et affiche la date de création

             }


        }while(FindNextFile(Fct1,&x));

         CloseHandle(Fct1);

    }

        return 0;
}


Fonction DateFile:
char* DateFile(char* nomDossier)
{
     FILETIME ft;
     SYSTEMTIME st;
     HANDLE hFile;
     char* date = (char*) malloc(sizeof(int) );

      if((hFile = CreateFile(nomDossier, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)) != INVALID_HANDLE_VALUE)
      {

                GetFileTime(hFile, &ft, 0, 0);
                FileTimeToLocalFileTime(&ft, &ft);
                FileTimeToSystemTime(&ft, &st);

                sprintf(date, "%02d/%02d/%d",st.wDay, st.wMonth, st.wYear);
                printf ("Date : %s\n", date);


                CloseHandle(hFile);
      }

      else
            printf("Erreur: 0x%08lX !\n", GetLastError());

     return date;
}



Le plantage a lieu a l affichage de la troisième date, pour 2 ca fonctionne sans planter. 3 sa plante en retournant -1073741819
Avais vous une idée ?

2 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
14 mars 2011 à 22:24
Je ne teste pas mais devrait aller.

char Dossier[] = "C:\\Users\\...\\history\\essai\\*.*";

int main(int argc, char *argv[])
{
  HANDLE Fct1;
  WIN32_FIND_DATA wfd;
  char buf[2048];
  char *c, *d, *p;
  FILETIME ft;
  SYSTEMTIME st;
  Fct1 = FindFirstFile(Dossier, &wfd);

  if(Fct1 == INVALID_HANDLE_VALUE) {
    printf("Erreur de listing");
    return 0;
  }
  
  printf("*** Affichage date fichier txt *** : \n\n");
  c = Dossier;
  d = buf;
  while(*d = *c) {c++; d++;} // d EST POINTEUR DE CHAINAGE

  do {
    // i = strstr(x.cFileName,".txt");    // cherche les fichiers .txt
    // NON, c'est au cul du nom qu'on verifie et SEULEMENT au cul.
    c = x.cFileName;
    p = d; // ON CHAINE DIRECT, AINSI ON AURA LE PTR FINAL POUR VERIF DE ".txt"
    while(*p = *c) {c++; p++;}
    // CreateFile() et GetFileTime() INUTILES
    if(*((DWORD*) (p - 4)) == 0x7478742E) { // '.txt' ou 0x7478742E, c'est idem.
      FileTimeToLocalFileTime(&wfd.ftCreationTime, &ft);
      FileTimeToSystemTime(&ft, &st);
      // TES  printf D'AFFICHAGE ICI
    }
    
  } while(FindNextFile(Fct1, &wfd));
  FindClose(Fct1); // NIET CloseHandle()
  return 0;
}

ciao...
BruNews, MVP VC++
3
jejefull1234 Messages postés 8 Date d'inscription dimanche 6 mars 2011 Statut Membre Dernière intervention 15 mars 2011
15 mars 2011 à 15:38
Merci de ton aide ton programme fonctionne nikel. je vais pouvoir continuer mon prog.
Merci
0
Rejoignez-nous