如何使用FILETIME/SYSTEMTIME或boost在C++中使用Win32设置文件的上次访问时间?

Enn*_*ael 2 c++ winapi boost

我有一些代码根据与上次访问日期的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

Ada*_*erg 6

从Win32 API:SetFileTime.如文档中所述,如果您不想更改其他时间戳,则可以传入NULL.

无论你做什么,都要小心.在Vista或更新的Windows形式中,上次访问时间实际上并未在访问时修改,仅在写入时修改,因此是Last Modified的别名.这样可以获得大量的文件系统效率 - 当你打开文件时你不会写时间戳 - 而是进行操作,我认为这是删除无人关心的文件,非常危险.Windows调试工具团队必须在agestore.exe中完全编码,这个工具完全符合符号文件.(如果Windows未配置为设置上次访问时间,则该工具无法运行并输出严重错误消息.)