Estoy almacenando en caché información de un archivo y quiero poder verificar periódicamente si el contenido del archivo se ha modificado para poder leer el archivo nuevamente para obtener el nuevo contenido si es necesario.
Es por eso que me pregunto si hay una manera de obtener la hora de última modificación de un archivo en C++.
Smeeheey
No hay una forma específica de idioma para hacer esto, sin embargo, el sistema operativo proporciona la funcionalidad requerida. En un sistema Unix, el stat
La función es lo que necesitas. hay un equivalente _stat
Función proporcionada para Windows en Visual Studio.
Así que aquí hay un código que funcionaría para ambos:
#include <sys/types.h>
#include <sys/stat.h>
#ifndef WIN32
#include <unistd.h>
#endif
#ifdef WIN32
#define stat _stat
#endif
auto filename = "/path/to/file";
struct stat result;
if(stat(filename.c_str(), &result)==0)
{
auto mod_time = result.st_mtime;
...
}
-
Entonces, ¿no hay nada que pueda usar que funcione tanto en UNIX como en Windows? :/
– Sr. Nicky
9 de noviembre de 2016 a las 10:12
-
Modificado para agregar soporte de Windows
– Smeeheey
9 de noviembre de 2016 a las 10:17
-
esto funcionó muy bien después de la codificación ciega esperando 10 minutos para permitir que travisci finalice la compilación remota 🙂
– Poder de Acuario
20 de abril de 2018 a las 18:23
dylan95
desde el momento de esta publicación, se ha lanzado c ++ 17 e incluye una biblioteca de sistema de archivos basada en la biblioteca de sistema de archivos boost:
https://en.cppreference.com/w/cpp/header/filesystem
que incluye una forma de obtener la hora de la última modificación:
https://en.cppreference.com/w/cpp/filesystem/last_write_time
-
Para usar std::filesystem en macOS con las herramientas de desarrollo de Apple, debe asumir Catalina o posterior.
– yig
5 oct 2020 a las 10:51
-
El tiempo devuelto no se puede utilizar de forma portátil en C++17. Pero desde C ++ 20, podemos lanzar entre relojes crono y convertir el tiempo devuelto a un systime que es portátil.
– Nicolás Dusart
29 de julio de 2021 a las 12:34
Puedes usar impulsos last_write_time
para eso. Boost es multiplataforma.
AquíEs el enlace del tutorial para eso.
Boost tiene la ventaja de que funciona con todo tipo de nombres de archivos, por lo que se encarga de los nombres de archivos que no son ASCII.
-
desde c++17 también como parte de la biblioteca estándar es.cppreference.com/w/cpp/filesystem/last_write_time
– sciamano
28/10/2018 a las 17:33
Tenga en cuenta que hay algunas limitaciones:
… El [time] la resolución es tan baja como una hora en algunos sistemas de archivos… Durante la ejecución del programa, el reloj del sistema puede establecerse en un nuevo valor por algún otro proceso, posiblemente automático…
También tenga en cuenta que después de copiar un archivo (en Windows) la última_escritura_hora de la copia es la última_escritura_hora del archivo original en lugar de la hora en que se creó la copia, como uno pensaría ingenuamente.
yig
Esta biblioteca multiplataforma (Mac, Windows, Linux) es fácil de agregar a un proyecto. Utiliza #ifdef’s para compilar la implementación correcta.
¿Qué le pasa al buen viejo C?
stat
¿llamar?– Jean-François Fabre
♦
9 de noviembre de 2016 a las 10:08
@Jean-FrançoisFabre, es una llamada al sistema Unix, por lo que no es multiplataforma
– SingerOfTheFall
9 de noviembre de 2016 a las 10:09
@SingerOfTheFall por eso no respondí.
– Jean-François Fabre
♦
9 de noviembre de 2016 a las 10:11