Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;如何检查文件的上次修改时间_C++_File Io_Last Modified - Fatal编程技术网

C++ C++;如何检查文件的上次修改时间

C++ C++;如何检查文件的上次修改时间,c++,file-io,last-modified,C++,File Io,Last Modified,我正在缓存文件中的一些信息,我希望能够定期检查文件的内容是否已被修改,以便在需要时可以再次读取文件以获取新内容 这就是为什么我想知道在C++中有没有文件最后修改时间的方法。 没有语言特定的方式来完成这个操作,但是操作系统提供了所需的功能。在unix系统中,stat函数是您所需要的。Visual Studio下为windows提供了一个等效的\u stat函数 因此,以下代码将同时适用于这两种情况: #include <sys/types.h> #include <sys/sta

我正在缓存文件中的一些信息,我希望能够定期检查文件的内容是否已被修改,以便在需要时可以再次读取文件以获取新内容


这就是为什么我想知道在C++中有没有文件最后修改时间的方法。

没有语言特定的方式来完成这个操作,但是操作系统提供了所需的功能。在unix系统中,
stat
函数是您所需要的。Visual Studio下为windows提供了一个等效的
\u stat
函数

因此,以下代码将同时适用于这两种情况:

#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;
    ...
}
#包括
#包括
#ifndef WIN32
#包括
#恩迪夫
#ifdef WIN32
#定义stat\u stat
#恩迪夫
自动文件名=“/path/to/file”;
结构统计结果;
if(stat(filename.c_str(),&result)==0)
{
自动修改时间=result.st\u mtime;
...
}

您可以使用boost的
最后一次写入时间
。Boost是跨平台的

这是该课程的教程链接


Boost的优点是它适用于所有类型的文件名,因此它可以处理非ASCII文件名。

请注意:

。。。某些文件系统的[时间]分辨率低至一小时。。。在程序执行期间,系统时钟可能会被其他一些(可能是自动的)进程设置为新值


自本文发表以来,c++17已经发布,其中包括一个基于boost文件系统库的文件系统库:

其中包括获取上次修改时间的方法:


还要注意,复制文件(在Windows上)后,副本的最后一次写入时间是原始文件的最后一次写入时间,而不是像人们天真地认为的那样创建副本的时间。

这个跨平台库(Mac、Windows、Linux)很容易添加到项目中。它使用#ifdef来编译正确的实现


好的旧C
stat
call有什么问题?@Jean-franoisfabre,这是一个unix系统调用,所以不交叉-platform@SingerOfTheFall这就是我没有回答的原因。因此,我没有任何东西可以在UNIX和Windows上使用:/修改为添加windows支持在盲编码等待10分钟让travisci结束远程编译后,这非常有效:)因为c++17也是标准库的一部分,为了在macOS上使用std::filesystem和Apple的开发工具,您必须假设Catalina或更高版本。