2009-08-26 7 views
1

sortie:FindFirstFile et FindNextFile question

The first file found is LOG_09.TXT 
Next file name is LOG_10.TXT 
Next file name is LOG_11.TXT 
Next fi       (cut off word "file"?) 

Fonction:

//Find last modified log file 
    hFind = FindFirstFile("..\\..\\LOGS\\LOG*.TXT", &FindFileData); 
    if (hFind == INVALID_HANDLE_VALUE) 
    { 
     printf ("FindFirstFile failed (%d)\n", GetLastError()); 
     return; 
    } 
    else 
    { 
     printf("The first file found is %s<br>",FindFileData.cFileName); 

     //List all the other files in the directory. 
     while (FindNextFile(hFind, &FindFileData) != 0) 
     { 
     printf ("Next file name is %s<br>", FindFileData.cFileName); //NOT DISPLAYING ALL NAMES CONSISTENTLY?? 

     } 

     dwError = GetLastError(); 
     FindClose(hFind); 

     if (dwError != ERROR_NO_MORE_FILES) 
     { 
     printf ("FindNextFile error. Error is %u.\n", dwError); 
     return (-1); 
     } 

    } 

Le mot "fichier" est en fait coupé court dans mon printf. Parfois, il affiche tous les noms de fichiers, parfois il en affiche quelques-uns, parfois il ne termine même pas la ligne citée printf, comme indiqué ci-dessus. Qu'est-ce qui cause cela et suis-je induit en erreur par la fonctionnalité printf? Dans le débogueur, il semble que tout va bien, mais je veux être certain et comprendre cela. Par exemple, je n'ai pas de caractère nul après i dans le fichier, n'est-ce pas? Pourquoi est-il coupé ici? Merci.

EDIT:Incorrect - Bibliothèque d'applications à un seul thread. (A été multithread avant, désolé)

L'impression dans un fichier donne la liste complète des fichiers alors que printf est "instable". Je ne sais pas, je comprends pourquoi ....

+0

Votre programme exécute-t-il plusieurs threads? – luke

+0

@Luke: Oui, c'est, cela va-t-il être modifié? @fbrereton: Je ne sais pas comment cela est sorti, mais c'est dans mon code. –

+0

seul thread en mode débogage ... plus confus. –

Répondre

1

Depuis votre application est multithread, le printf peut se couper court à mi-chemin à travers, par un autre thread qui obtient alors le contrôle, essayez ceci:

  1. Après tout printf (), utilisez fflush (stdout) ;, pour vous assurer que le tampon est vidé.
  2. Si cela ne le résout pas, vous pouvez protéger la ressource stdout avec un mutex nommé, ou un critical section. Enveloppez fondamentalement tous les appels printf + fflush avec un Wait, suivi d'un Signal sur le mutex nommé.

(Vous ne savez pas si l'étape 2 sera nécessaire).

+1

il est à noter que stdout n'est pas mis en mémoire tampon sur les fenêtres. cela signifie que la probabilité de sortie entrelacée vers stdout est beaucoup plus grande. le rinçage serait une bonne pratique, et une section critique serait le choix le plus simple et le mieux adapté à ce problème. –

2

Puisque vous dites que votre programme est multi-thread, je suppose que le thread dans lequel cette fonction s'exécute est en train d'être tué tôt. Cela ne se produirait pas lors de l'exécution du débogueur. Vous avez besoin d'une synchronisation de thread pour vous assurer que ce thread est autorisé à terminer.

+0

Je crois que cela pourrait arriver, c'est juste moins probable –