【问题标题】:C++ how to get the recently changed timestamp of a file?C ++如何获取文件最近更改的时间戳?
【发布时间】:2017-06-20 18:39:58
【问题描述】:

我想确定 Windows 上文件最近更改的时间戳。

是的,我用 stat 函数和 st_atime、st_mtime、st_ctime。但是,Windows 不会为特定文件更新这些时间戳。 (我不想改变这种行为,因为这将在稍后针对客户)。

那么,如何确定文件最近更改的时间戳?

例如

  • 重命名文件名的时间戳(目前无法使用

  • 修改文件的时间戳(mctime 提供了这个,但我会推荐一种单向解决方案)

提前致谢。

【问题讨论】:

    标签: c++ stat filetime


    【解决方案1】:

    如果您在 Windows 上,请使用 GetFileTime (https://msdn.microsoft.com/en-us/library/windows/desktop/ms724320(v=vs.85).aspx),您已通过 CreateFile (https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx) 打开文件。

    为此,我强烈建议您阅读文章“检索上次写入时间”:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724926(v=vs.85).aspx

    在你的 cmets 之后编辑

    在您应用的包含部分中:

    #include <string>
    #include <sstream>
    #include <iostream>
    

    在方法GetLastWriteTime从链接而不是StringCchPrintf添加:

    // Build a string showing the date and time.
    std::stringstream ss;
    ss << stLocal.wYear << "-" << stLocal.wMonth << "-" << stLocal.wDay << " " << stLocal.wHour << ":" << stLocal.wMinute ;
    std::string timeString = ss.str();
    std::cout << timeString;
    

    请阅读来自http://www.cprogramming.com/tutorial/c++-iostreams.html 的文档,然后阅读来自http://en.cppreference.com/w/cpp/io/basic_stringstream 的参考

    【讨论】:

    • 很酷,我让它工作了,但这与 stat 函数返回的值相同吗?
    • @TVAvanHesteren 对不起,我不熟悉stat 在 windows 上的行为:( 请比较:msdn.microsoft.com/en-us/library/14h5k7ff(v=vs.80).aspx
    • 问题是我只对客户端更改文件名时的时间戳感兴趣。 stat 函数返回最后修改时间很好,但更改文件名似乎不包括在修改时间中。 (至少在较新的 Windows 版本上默认不是)
    【解决方案2】:

    我在使用 Boost 的 filesystem::last_write_time(path) 方面取得了很大的成功,尽管我的 Windows 经验告诉我,如果您在短时间内对文件进行大量写入,那么返回的时间戳的分辨率是'足以区分您是否在每次写入后询问时间戳

    你可以这样使用它:

    boost::filesystem::path filePath = "Path/To/My/File.txt"
    std::time_t writeTime = boost::filesystem::last_write_time(filePath);
    std::ostringstream ss;
    ss << std::put_time(&writeTime, "%c %Z");
    std::string timeString = ss.str();
    

    参考资料:

    编辑:

    由于操作系统不会在重命名时更新文件的时间戳,不幸的是,您将不得不开始监听事件。 This SO post 提供了一些关于从 C++ 挂钩的很好的信息。

    C++ 端有ReadDirectoryChangesW,它允许您将回调作为LPOVERLAPPED_COMPLETION_ROUTINE 传递,就像许多特定于操作系统的代码一样,它很难很快地遵循。

    至于在重命名时“触摸”文件以更新时间戳,您可以将其复制到自身。见CopyFile

    如果您不反对编写托管 C++ 代码,则可以使用 FileSystemWatercher 的 Renamed Event

    【讨论】:

    • 这会在客户端更改文件名时返回更新时间吗?所以不打开也不编辑文件?
    • @TVAvanHesteren:是的,无论文件如何更改,这都会返回最新的时间戳。如果您正在寻找在修改文件时调用的回调,则需要监听操作系统事件(深入研究 Windows API)
    • 安迪,是的,但请尝试重命名文件。我相信 Windows API 不会更新 Windows 8 及更高版本的时间戳。因此,当他们更改文件名时,时间戳是旧的
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2020-06-17
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多