C ++如何检查文件的最后修改时间

Posted

技术标签:

【中文标题】C ++如何检查文件的最后修改时间【英文标题】:C++ How to check the last modified time of a file 【发布时间】:2017-03-23 02:30:41 【问题描述】:

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

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

【问题讨论】:

好老的 C stat 调用有什么问题? @Jean-FrançoisFabre,这是一个unix系统调用,所以不是跨平台的 @SingerOfTheFall 这就是我没有回答的原因。 【参考方案1】:

没有特定于语言的方法来执行此操作,但是操作系统提供了所需的功能。在 unix 系统中,stat 函数就是您所需要的。在 Visual Studio 下为 Windows 提供了等效的 _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;
    ...

【讨论】:

那么我可以使用的任何东西都可以在 UNIX 和 Windows 上运行吗? :// 修改添加windows支持 这在盲编码等待 10 分钟让 travisci 结束远程编译后效果很好:)【参考方案2】:

自发这篇文章以来,c++17 已经发布,它包含了一个基于 boost 文件系统库的文件系统库:

https://en.cppreference.com/w/cpp/header/filesystem

其中包括一种获取最后修改时间的方法:

https://en.cppreference.com/w/cpp/filesystem/last_write_time

【讨论】:

为了在 macOS 上通过 Apple 的开发者工具使用 std::filesystem,您必须假设 Catalina 或更高版本。 返回的时间在 C++17 中是不可移植的。但是从 C++20 开始,我们可以在 chrono 时钟之间进行转换,并将返回的时间转换为可移植的 systime。【参考方案3】:

您可以为此使用 boost 的 last_write_time。 Boost 是跨平台的。

Here 的教程链接。

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

【讨论】:

自 c++17 起也作为标准库的一部分 en.cppreference.com/w/cpp/filesystem/last_write_time【参考方案4】:

请注意有some limitations:

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

【讨论】:

【参考方案5】:

另请注意,在复制文件后(在 Windows 上),副本的 last_write_time 是原始文件的 last_write_time,而不是创建副本的时间,人们会天真地认为。

【讨论】:

【参考方案6】:

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

https://github.com/jameswynn/simplefilewatcher

【讨论】:

以上是关于C ++如何检查文件的最后修改时间的主要内容,如果未能解决你的问题,请参考以下文章

linux如何得到一个文件的最后修改时间

怎么更改文件修改时间?

怎么修改文件修改日期

如何在 Go 中获取文件的最后访问日期和时间?

Linux下,如何将最后修改时间在某个时间之前的文件删除掉?

如何在文件系统中获取最后修改的日期和时间?