我有一些代码根据与上次访问日期的time_t比较删除一些文件,并且正在寻找如何编写SetLastAccessTime方法以在我的单元测试中使用.
这是我的获取:
bool GetLastAccessTime(const std::string &filename, time_t& lastAccessTime)
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
hFind = FindFirstFile(filename.c_str(), &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
return false;
FILETIME fTime = FindFileData.ftLastAccessTime;
FindClose(hFind);
SYSTEMTIME sTime;
FileTimeToSystemTime(&fTime, &sTime);
struct tm tmTime;
tmTime.tm_hour = sTime.wHour;
tmTime.tm_min = sTime.wMinute;
tmTime.tm_mday = sTime.wDay;
tmTime.tm_mon = sTime.wMonth;
tmTime.tm_sec = sTime.wSecond;
tmTime.tm_year = sTime.wYear - 1900;
time_t t = mktime(&tmTime);
lastAccessTime = t;
return true;
}
Run Code Online (Sandbox Code Playgroud)
我猜我是以某种方式做反向的?我甚至不确定我想要在哪里结束.
我宁愿做这样的事情:
boost::filesystem::path p(filename)
std::time_t t = boost::filesystem::last_access_time(p);
Run Code Online (Sandbox Code Playgroud)
但这似乎并不存在,从我能够找到的(虽然有一个last_write_time).如果还有另一种我忽略的boost :: filesystem技术,我当然对此持开放态度.
系统:Win32(XP),Boost库:1.44 v2,Dev env:Visual Studio TS 2008
从Win32 API:SetFileTime.如文档中所述,如果您不想更改其他时间戳,则可以传入NULL.
无论你做什么,都要小心.在Vista或更新的Windows形式中,上次访问时间实际上并未在访问时修改,仅在写入时修改,因此是Last Modified的别名.这样可以获得大量的文件系统效率 - 当你打开文件时你不会写时间戳 - 而是进行操作,我认为这是删除无人关心的文件,非常危险.Windows调试工具团队必须在agestore.exe中完全编码,这个工具完全符合符号文件.(如果Windows未配置为设置上次访问时间,则该工具无法运行并输出严重错误消息.)