美文网首页程序员
(C语言)获取并修改文件夹时间(创建时间、修改时间、访问时间)

(C语言)获取并修改文件夹时间(创建时间、修改时间、访问时间)

作者: 牛i蛋 | 来源:发表于2019-03-17 11:28 被阅读61次

    背景

    在Windows系统下没有提供可以对文件夹时间属性修改的方法或者API,在上一篇文章中我们提到了文件时间的函数,那么我们可以以打开文件的方式打开文件夹,然后通过修改文件时间的API函数对文件夹时间进行访问获取并进行修改。

    解决方案

    首先,我们介绍一个函数CreateFile:

    HANDLE CreateFile(
      LPCTSTR lpFileName,                          // 文件名指针
     DWORD dwDesiredAccess,                       // 访问模式
     DWORD dwShareMode,                           // 共享模式
     LPSECURITY_ATTRIBUTES lpSecurityAttributes,  //安全属性
     DWORD dwCreationDisposition,                 // 创建方式
     DWORD dwFlagsAndAttributes,                  // 文件属性
     HANDLE hTemplateFile                         // 指向待复制属性的文件指针
    );
    

    当要对文件夹进行操作时,将第一个参数IpFileName设置为文件夹的名称或者路径;将访问模式设置为GENERIC_READ,对于文件夹属性信息的写入需要GENERIC_WRITE的帮助;由于CreateFile函数在进行文件夹操作的时候,不能以创建的方式进行,所以创建方式只能打开已经存在的对象,因此将dwCreationDisposition设置为OPEN_EXITSING;dwFlagsAndAttributes参数的设置是比较重要的,正是通过将该参数设置为FILE_FLAG_BACKUP_SEMANTICS属性才使CreateFile()函数来进行打开文件夹的操作。

    实践

    我们运行程序,获取一个文件夹的时间属性并对其进行修改 程序运行截图 ,我们右键点开文件夹的属性,来验证程序的正确性: 验证 看来程序是正确的,下面我们就进行修改,选择1: 修改成功程序截图 我们看到程序返回Success成功,那么我们验证一下: 修改时间验证 创建时间修改

    我们可以看到文件夹的时间属性修改成功!
    下面我就分享一下程序源码,大家可以根据自己的情况进行更改,也可以留言提问题哟!

    程序源码

    #include <Windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    void print(FILETIME ftime)
    {
        char                    str[50];
        SYSTEMTIME rtime;
        FILETIME            ltime;
    
        memset(str,0,50);
        FileTimeToLocalFileTime(&ftime,&ltime);
        FileTimeToSystemTime(&ltime,&rtime);        //将文件时间转化为系统时间
        sprintf(str, "%04u-%02u-%02u %02u:%02u:%02u",rtime.wYear, rtime.wMonth, rtime.wDay, rtime.wHour, rtime.wMinute, rtime.wSecond);
        printf("%s\n",str);
    }
    
    int main(int argc, char *argv[])
    {
        printf(argv[1]);
        printf("\n");
        HANDLE hDir = CreateFile(argv[1], GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
        if(hDir == INVALID_HANDLE_VALUE)
        {
            printf("Get the dictionary failed!\n");
            CloseHandle(hDir);
            return 0;
        }
        
        //定义变量
        FILETIME                IpCreationTime;                 //文件夹的创建时间
        FILETIME                IpLastAccessTime;               //对文件夹的最近访问时间
        FILETIME                IpLastWriteTime;                //文件夹的最近修改时间
        FILETIME            ftime;
    
        SYSTEMTIME     ktime;
    
        //获取文件夹的时间属性
        if(GetFileTime(hDir, &IpCreationTime, &IpLastAccessTime, &IpLastWriteTime))
        {
            printf("获取文件夹时间成功,如下:\n");
            printf("初始创建时间为:\t");
            print(IpCreationTime);
            printf("最近访问时间为:\t");
            print(IpLastAccessTime);
            printf("最近修改时间为:\t");
            print(IpLastWriteTime);
        }
    
        int temp = 0;
        printf("\n是否对文件时间进行修改?(1:修改,2:不修改):");
        scanf("%d",&temp);
        if(temp == 1)
        {
            //定义一些变量
            char year[15],times[15];
            SYSTEMTIME kktime;
            FILETIME  pptime;
            memset(year,0,15);
            memset(times,0,15);
    
            printf("请输入要修改为何时间(如2019-02-18 08:00:46):");
            scanf("%s %s",year,times);
            sscanf(year, "%d-%d-%d", &kktime.wYear, &kktime.wMonth, &kktime.wDay);
            sscanf(times, "%d:%d:%d", &kktime.wHour, &kktime.wMinute, &kktime.wSecond);
            kktime.wDayOfWeek  = 1;
            kktime.wMilliseconds = 0;
    
            
            SystemTimeToFileTime(&kktime, &pptime);
            //下面我将三个时间全部修改了,小伙伴可以根据自己的情况进行修改
            BOOL retval = SetFileTime(hDir, &pptime, &pptime, &pptime);     
            if(retval == TRUE)
            {
                printf("Success\n");
            }
            else
            {
                printf("Failed\n");
            }
        }
        else
        {
            printf("再见!\n");
        }
        CloseHandle(hDir);
        return 0;
    }
    

    相关文章

      网友评论

        本文标题:(C语言)获取并修改文件夹时间(创建时间、修改时间、访问时间)

        本文链接:https://www.haomeiwen.com/subject/eoddmqtx.html