【发布时间】:2017-06-20 18:39:58
【问题描述】:
我想确定 Windows 上文件最近更改的时间戳。
是的,我用 stat 函数和 st_atime、st_mtime、st_ctime。但是,Windows 不会为特定文件更新这些时间戳。 (我不想改变这种行为,因为这将在稍后针对客户)。
那么,如何确定文件最近更改的时间戳?
例如
重命名文件名的时间戳(目前无法使用)
修改文件的时间戳(mctime 提供了这个,但我会推荐一种单向解决方案)
提前致谢。
【问题讨论】:
我想确定 Windows 上文件最近更改的时间戳。
是的,我用 stat 函数和 st_atime、st_mtime、st_ctime。但是,Windows 不会为特定文件更新这些时间戳。 (我不想改变这种行为,因为这将在稍后针对客户)。
那么,如何确定文件最近更改的时间戳?
例如
重命名文件名的时间戳(目前无法使用)
修改文件的时间戳(mctime 提供了这个,但我会推荐一种单向解决方案)
提前致谢。
【问题讨论】:
如果您在 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 在 windows 上的行为:( 请比较:msdn.microsoft.com/en-us/library/14h5k7ff(v=vs.80).aspx
我在使用 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
【讨论】: