Какие операции обновляют время последнего доступа? - PullRequest
0 голосов
/ 10 апреля 2020

Предполагая, что данная файловая система отслеживает время последнего доступа (он же atime) - какие операции над файлом приводят к обновлению atime?

Насколько я знаю:

  • открытие существующего файла (и последующее закрытие связанного дескриптора / fd) делает не обновление atime
  • чтение / запись файла обновит atime (интересно, если операция read-0-bytes делает что)
  • чтение дескриптора безопасности файла (через связанный Win32 API) не обновление atime или других атрибутов файла

Есть ли исчерпывающий список операций это обновление atime?

1 Ответ

0 голосов
/ 15 апреля 2020

Последнее время доступа включает в себя последний раз, когда файл или каталог записывался в , считывался из или, в случае исполняемых файлов, выполнялся .

Другие операции, такие как доступ к файлу для получения свойств, отображаемых в Проводнике или в другом средстве просмотра, доступ к файлу для получения его значка и т. Д. c. не обновлять время последнего доступа.

См. "GetFileTime - lpLastAccessTime", " Как получить доступ к файлу без обновления времени последнего доступа?"

Обновление: Добавить результаты теста чтения / записи 0 байтов и чтения / записи 1 байта.

Код, использованный для тестирования:

void GetLastAccessTime(HANDLE hFile)
{
    FILETIME ftAccess;
    SYSTEMTIME stUTC, stLocal;

    printf("Get last access time\n");

    // Retrieve the file times for the file.
    if (!GetFileTime(hFile, NULL, &ftAccess, NULL))
        return;

    // Convert the last-write time to local time.
    FileTimeToSystemTime(&ftAccess, &stUTC);
    SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);

    // Build a string showing the date and time.
    wprintf(
        L"%02d/%02d/%d  %02d:%02d \n",
        stLocal.wMonth, stLocal.wDay, stLocal.wYear,
        stLocal.wHour, stLocal.wMinute);
}

int main()
{
    HANDLE tFile = INVALID_HANDLE_VALUE;

    printf("Open file\n");
    // Open file
    tFile = CreateFile(L"C:\\Users\\ritah\\Desktop\\test1.txt", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    if (INVALID_HANDLE_VALUE == tFile)
    {
        printf("CreateFile fails with error: %d\n", GetLastError());
        getchar();
        return 0;
    }

    printf("Sleep 60 seconds\n");
    Sleep(60000);

    GetLastAccessTime(tFile);

    // Read 0 bytes
    printf("Read 0 bytes\n");
    WCHAR redBuf[10];
    DWORD redBytes = 0;
    if(!ReadFile(tFile, redBuf, 0, &redBytes, NULL))
    {
        printf("ReadFile fails with error: %d\n", GetLastError());
        getchar();
        return 0;
    }

    printf("Sleep 60 seconds\n");
    Sleep(60000);

    GetLastAccessTime(tFile);

    // Write 0 bytes
    printf("Write 0 bytes\n");
    WCHAR writeBuf[] = L"write test";
    DWORD writeBytes = 0;
    if(!WriteFile(tFile, writeBuf, 0, &writeBytes, NULL))
    {
        printf("WriteFile fails with error: %d\n", GetLastError());
        getchar();
        return 0;
    }

    printf("Sleep 60 seconds\n");
    Sleep(60000);

    GetLastAccessTime(tFile);

    getchar();
}

enter image description here

enter image description here

Итак, чтение / запись 0 байт не обновляется время последнего доступа .

...