Как установить время последнего доступа к файлу на Win32 в C ++, используя FILETIME / SYSTEMTIME или boost? - PullRequest
2 голосов
/ 25 ноября 2010

У меня есть код, который удаляет некоторые файлы на основе сравнения time_t с последней датой доступа, и я ищу, как написать метод SetLastAccessTime для использования в моем модульном тесте.

Вот мой Get:

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;
}    

Я полагаю, я делаю наоборот?Я даже не совсем уверен, где я хочу оказаться.

Я бы предпочел сделать что-то вроде этого:

boost::filesystem::path p(filename)
std::time_t t = boost::filesystem::last_access_time(p);

но этого, кажется, не существует, изчто я смог найти (хотя есть last_write_time).Если есть какая-то другая технология boost :: filesystem, которую я пропустил, я, безусловно, открыт для этого.

Система: Win32 (XP), библиотеки Boost: 1.44 v2, Dev env: Visual Studio TS 2008

Ответы [ 2 ]

6 голосов
/ 25 ноября 2010

Из Win32 API: SetFileTime .Как указано в документации, вы можете передать NULL, если не хотите менять другие отметки времени.

Что бы вы ни делали, будьте осторожны с этим.В Vista или более поздних версиях Windows время последнего доступа фактически не изменяется при доступе, только при записи, и, следовательно, является псевдонимом последнего изменения.Это значительно повышает эффективность файловой системы - вы не пишете метки времени при открытии файла - но делаете свою работу, которая, как я предполагаю, заключается в удалении файлов, которые никому не нужны, очень опасна.Команде Debugging Tools for Windows пришлось в точности кодировать это в agestore.exe, инструменте, который делает именно это для файлов символов.(Средство не запускается и выдает строгое сообщение об ошибке, если Windows не настроена для установки времени последнего доступа.)

1 голос
/ 25 ноября 2010

Разве вы не можете использовать SetFileTime , являющийся аналогом GetFileTime?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...