2012-02-21 14 views
6

Cómo verificar c, linux si un archivo ha sido actualizado/modificado.c linux compruebe si el archivo se actualiza/cambia/modifica?

Quiero verificar la actualización de un archivo antes de abrirlo y realizar operaciones de extracción/E/S.

+0

¿Es solo si el archivo es diferente que se debe procesar (actualizado no significa necesariamente diferente)? – hmjd

+2

También podría mirar en ['inotify'] (http://linux.die.net/man/7/inotify) –

+0

digamos que es un archivo srt/subtitle/captions. A mi id me gusta comprobar si se ha actualizado antes de extraer datos de él. –

Respuesta

11

Mire man page para stat(2). Obtenga el miembro st_mtime de la estructura struct stat, que le indicará la hora de modificación del archivo. Si el mtime actual es posterior a un mtime anterior, el archivo ha sido modificado.

Un ejemplo:

int file_is_modified(const char *path, time_t oldMTime) { 
    struct stat file_stat; 
    int err = stat(path, &file_stat); 
    if (err != 0) { 
     perror(" [file_is_modified] stat"); 
     exit(errno); 
    } 
    return file_stat.st_mtime > oldMTime; 
} 

Aquí es an introduction to inotify, si eso es lo que estás buscando.

+0

si la estadística obtiene un error y no devuelve 0, ¿significa que el archivo se ha modificado? –

+0

Gracias por la edición ... ¿qué quieres decir? – Anthony

+2

@ Mr.32: Creo que está confundido con el mensaje. Lo que significa es que el error ha ocurrido en la función 'file_is_modified' (ese es el nombre de la función si lo ve).Tal vez 'perror (" [file_is_modified] stat ");' no habría hecho que tuvieras esta duda –

5

La manera canónica es verificar el mtime del archivo a través de stat(2).

+0

podría publicar un bit de código? –

+3

¿Qué pasa con el ejemplo en la página de manual? –

5

Tienes que usar inotify.

stat() es peor que inútil para este propósito. Si st_mtime es diferente a la última vez que lo verificó, esto indica que el archivo ha cambiado y todo está bien.

¿Pero y si el st_mtime es el mismo? No hay garantía de que esto signifique que el archivo no se modificó dentro de la granularidad de la marca de tiempo del sistema de archivos. En ext3, por ejemplo, la granularidad tiende a estar en milisegundos. Tampoco puede confiar en la diferencia de tiempo entre su verificación, lo que importa es qué tan rápido se haya podido cambiar el archivo después de la última vez que su proceso lo verificó.

Así que incluso si el st_mtime es el mismo, no puede estar seguro de que el archivo no ha cambiado. Por lo tanto, debes asumir que sí y no tiene sentido que te engañes haciendo la prueba.

Los mismos problemas se aplican a st_ino, si está esperando que el archivo (de ese nombre) sea reemplazado por un nuevo archivo en una operación de crear y reemplazar. Los números de inodo se pueden reutilizar, y después de un par de reemplazos, un archivo (por nombre) puede regresar a su número de inodo original nuevamente.

El mismo problema se aplica al tamaño del archivo, o incluso a la creación de un hash del archivo. Todo lo que le permite determinar es que el archivo ha cambiado. Ninguno de estos métodos le permite estar completamente seguro de que no ha cambiado, incluso hash (aunque eso se acerca a la confianza).

No pierdas tu tiempo con stat(), es una tontería.

Cuestiones relacionadas