Bonjour,
Je travaille actuellement sur une petite routine de rotation de log en C++ sous Windows.
Je rencontre des incohérences sur la date de création des fichiers de log dans le cas suivant :
1 - fichier 'toto.log' présent sur disque avec une date de création à hier
2 - suppression ou déplacement du fichier 'toto.log' (pour la rotation des log)
3 - création d'un nouveau fichier vierge 'toto.log'
Si l'on observe pas une pause minimum entre le point 2 et le point 3 (15s semble marcher correctement), le nouveau fichier créé garde la date de création de l'ancien !
J'ai essayer avec la lib C classique stat(), avec FindFirstFile(), puis avec GetFileInformationByHandle(), dans tous les cas la date de création retourné est fausse.
La doc MSDN indique pour FindFirstFile : "Note: In rare cases, file information on NTFS file systems may not be current at the time you call this function. To be assured of getting the current file information, call the GetFileInformationByHandle function". Mais GetFileInformationByHandle ne marche pas mieux dans ce cas.
Enfin, j'ai pu également reproduire le 'bug' avec un simple explorateur de fichier.
Pire, testé avec explorateur (manip à faire en moins d'une 10aine de secondes) :
1 - supprimer un fichier 'toto.log' avec date de création huier
2 - creer un fichier 'titi.log', inspecter la date de création : ok
3 - renommer 'titi.log' en 'toto.log' => la date de création repasse à hier !
Y a t'il un appel système a faire pour forcer la mise à jour du filesystem ? Car bloquer mon process 15s pour faire tourner les logs n'est pas des plus élégant !
Partager