2012-05-04 24 views
8

Estoy trabajando en un programa en C donde necesito obtener la última hora modificada del archivo. Lo que hace el programa es una función que recorre cada archivo dentro de un directorio y cuando se encuentra un archivo en particular llama a otra función para verificar las últimas horas modificadas del archivo.Obtener la última hora del archivo en linux

Dentro del directorio no es un mylog.txt.1, mylog.txt.2 y mylog.txt.3 etc. Cuando enumero el directorio en Linux usando el comando ll puedo ver que mylog.txt.1 y mylog.txt.2 fueron modificados en el 4 de mayo y mylog.txt.3 se modificó el 3 de mayo.

Cuando el programa comprueba cada uno de estos archivos, siempre regresa el 3 de mayo. A continuación está el código que estoy usando.

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; 
} 

He intentado todas las diferentes variaciones de st_ctime, es decir st_mtime y st_atime pero todos ellos tercio de retorno puede.

Gracias por cualquier ayuda que pueda proporcionar.

+0

tal vez la limpieza en primer lugar: ¿por qué pasar a un tamaño de 20 a 'strftime' mientras que el tampón es 10 de largo? ¿por qué no verificar el valor de retorno de 'stat'? Si 'stat' falla, está analizando un valor de basura. – mvds

+0

@mvds disculpa que fue un error tipográfico – Boardy

+0

asegúrate de pasar diferentes rutas de archivos, también "attrib.st_ctime" dará la "hora del último cambio de estado", si estás buscando la "hora de la última modificación" debes usar " attrib.st_mtime " – ray

Respuesta

9

Este es uno de esos casos donde importan las zonas horarias. Obtiene gmtime del st_mtime. En su lugar, debe utilizar localtime viz.

strftime(date, 20, "%d-%m-%y", localtime(&(attrib.st_ctime))); 

esto se debe a ls utiliza la información de zona horaria, y cuando se utiliza gmtime como parte de la pantalla, se omite deliberadamente cualquier información de zona horaria.

+1

Aun así, recomendaría muchos más errores para verificar su función. – Petesh

3

cosas que arreglar:

  • utilizar el campo adecuado, es decir st_ctime.
  • Compruebe que stat() tiene éxito antes de usar su resultado.
  • Utilice strftime(date, sizeof date, ... para eliminar el riesgo de usar el tamaño de búfer incorrecto.

Al principio sospeché que su sistema de archivos simplemente no soportaba el seguimiento de la hora del último cambio, pero como dice que otras herramientas logran mostrarlo, sospecho que el código se está rompiendo por algún motivo.

¿Podría ser que los nombres de los archivos no sean completos, es decir, que no incluyan el prefijo de directorio correcto?

9

Esto funcionó bien para mí:

#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)); 
} 
Cuestiones relacionadas