程序员

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

2019-03-17  本文已影响61人  牛i蛋

背景

在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;
}
上一篇 下一篇

猜你喜欢

热点阅读