web-dev-qa-db-fra.com

Obtenir la dernière heure de modification du fichier sous Linux

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.

16
Boardy

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.

13
Petesh

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));
}
17
qwertz

Choses à corriger:

  • Utilisez le champ approprié, c'est-à-dire st_ctime.
  • Vérifiez que stat() réussit avant d'utiliser son résultat.
  • Utilisez 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é?

3
unwind