C ++如何检查文件的最后修改时间
Posted
技术标签:
【中文标题】C ++如何检查文件的最后修改时间【英文标题】:C++ How to check the last modified time of a file 【发布时间】:2017-03-23 02:30:41 【问题描述】:我正在缓存文件中的一些信息,我希望能够定期检查文件的内容是否已被修改,以便在需要时再次读取文件以获取新内容。
这就是为什么我想知道是否有办法在 C++ 中获取文件的最后修改时间。
【问题讨论】:
好老的 Cstat
调用有什么问题?
@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 ++如何检查文件的最后修改时间的主要内容,如果未能解决你的问题,请参考以下文章