如何获取目录的属性,例如上次访问和上次修改

Posted

技术标签:

【中文标题】如何获取目录的属性,例如上次访问和上次修改【英文标题】:How to get attribute of a directory like last access and last modify 【发布时间】:2020-06-29 09:48:23 【问题描述】:

我想获取目录的时间戳,然后将其显示给用户。我编写了以下函数,但是当我提供目录的完整路径以显示其时间戳(如访问时间)时,它不起作用。我应该怎么做才能解决这个问题?我不知道我应该如何打开一个目录并正确获取有关常规文件的时间戳的信息,我的代码可以正常工作,但是当我想提取有关目录的信息时它不起作用。

#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <strsafe.h>

BOOL GetLastWriteTimeDirectory(HANDLE arg_h_file, LPSTR arg_lpsz_string, DWORD arg_dw_size)

    FILETIME ft_CreateTime, ft_AccessTime, ft_WriteTime;
    SYSTEMTIME st_UTC, st_Local;
    DWORD dw_Return;

    // Retrieve the file times for the file.
    if (!GetFileTime(arg_h_file, &ft_CreateTime, &ft_AccessTime, &ft_WriteTime))
    
        return FALSE;
    

    // Convert the last-write time to local time.
    FileTimeToSystemTime(&ft_WriteTime, &st_UTC);
    SystemTimeToTzSpecificLocalTime(NULL, &st_UTC, &st_Local);

    // Build a string showing the date and time.
    dw_Return = StringCchPrintfA(arg_lpsz_string, arg_dw_size, "%02d/%02d/%d  %02d:%02d", st_Local.wMonth, st_Local.wDay, st_Local.wYear, st_Local.wHour, st_Local.wMinute);

    if (S_OK == dw_Return)
    
        return TRUE;
    
    else
    
        return FALSE;
    


bool AttributeLastAccessDirectory(const char* arg_path)

    HANDLE handleFile;
    char bufferLastAccessTime[MAX_PATH];
    char pathDirectory[MAX_PATH];

    strcpy(pathDirectory, arg_path);

    handleFile = CreateFileA(pathDirectory, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);

    if (handleFile == INVALID_HANDLE_VALUE)
    
        return false;
    

    if (GetLastWriteTimeDirectory(handleFile, bufferLastAccessTime, MAX_PATH))
    
        printf("\n\t\t");
        printf("%s", "Last Accessed: \t");
        printf("%s\n", bufferLastAccessTime);
        CloseHandle(handleFile);
        return true;
    

    CloseHandle(handleFile);
    return false;



int main(int argc, char* argv[])

    AttributeLastAccessDirectory("C:\\Users\\mkahs\\Desktop\\Sample\\");

    return 0;

【问题讨论】:

“它不起作用” 不是问题陈述。我们不知道您期望代码做什么,也不知道观察到的行为是什么。请阅读How to Ask。 【参考方案1】:

根据documentation for CreateFileA:

要使用 CreateFile 打开目录,请将 FILE_FLAG_BACKUP_SEMANTICS 标志指定为 dwFlagsAndAttributes 的一部分。在没有 SE_BACKUP_NAMESE_RESTORE_NAME 权限的情况下使用此标志时,仍然适用适当的安全检查。

您的CreateFileA 函数调用当前将dwFlagsAndAttributes 参数(第六个参数)设置为0。将其设置为FILE_FLAG_BACKUP_SEMANTICS 应该可以解决问题。

另外,不需要pathDirectory 数组和设置它的strcpy 调用。 arg_path参数可以直接传给CreateFileA

【讨论】:

以上是关于如何获取目录的属性,例如上次访问和上次修改的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Gremlin 在 Titan 中获取 Edge 日期属性大于上次访问日期的通知?

如何获取 Google 机器人上次访问该页面的时间?

Django:获取上次用户访问日期

NSFileManager OS X 上次修改日期

c#获取文件上次访问权限或可用性

如何设置目录属性?