Je travaille sur un programme C où j'ai besoin d'obtenir la dernière heure de modification du fichier. Ce que fait le programme, c'est qu'une fonction parcourt chaque fichier d'un répertoire et lorsqu'un ou des fichiers particuliers sont trouvés, elle appelle une autre fonction pour vérifier les dernières heures modifiées du fichier.
Dans le répertoire, il y a un mylog.txt.1
, mylog.txt.2
et mylog.txt.3
etc. Lorsque je répertorie le répertoire sous linux à l'aide de la commande ll, je peux voir que mylog.txt.1
et mylog.txt.2
ont été modifiés le 4 mai et mylog.txt.3
a été modifié le 3 mai.
Cependant, lorsque le programme vérifie chacun de ces fichiers, il revient toujours le 3 mai. Voici le code que j'utilise.
void getFileCreationTime(char *filePath)
{
struct stat attrib;
stat(filePath, &attrib);
char date[10];
strftime(date, 10, "%d-%m-%y", gmtime(&(attrib.st_ctime)));
printf("The file %s was last modified at %s\n", filePath, date);
date[0] = 0;
}
J'ai essayé toutes les différentes variantes de st_ctime
, c'est à dire. st_mtime
et st_atime
mais ils reviennent tous le 3 mai.
Merci pour toute l'aide que vous pouvez apporter.
C'est l'un de ces cas où les fuseaux horaires sont importants. Vous obtenez gmtime
du st_mtime
. Vous devriez plutôt utiliser localtime
viz.
strftime(date, 20, "%d-%m-%y", localtime(&(attrib.st_ctime)));
c'est parce que ls
utilise vos informations de fuseau horaire, et lorsque vous avez utilisé gmtime
dans le cadre de l'affichage, il a délibérément omis toutes les informations de fuseau horaire.
CA marchait bien pour moi:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/stat.h>
#include <sys/types.h>
void getFileCreationTime(char *path) {
struct stat attr;
stat(path, &attr);
printf("Last modified time: %s", ctime(&attr.st_mtime));
}
Choses à corriger:
st_ctime
.stat()
réussit avant d'utiliser son résultat.strftime(date, sizeof date, ...
Pour supprimer le risque d'utiliser une taille de tampon incorrecte.J'ai d'abord soupçonné que votre système de fichiers ne supportait tout simplement pas le suivi de la dernière modification, mais puisque vous dites que d'autres outils parviennent à le montrer, je soupçonne que le code se casse pour une raison quelconque.
Se pourrait-il que les noms de fichiers ne soient pas des noms de chemin complets, c'est-à-dire qu'ils n'incluent pas le préfixe de répertoire approprié?