C语言实现 修改文件的创建时间,上一次访问的时间,最近一次修改的时间

Posted Love丶伊卡洛斯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言实现 修改文件的创建时间,上一次访问的时间,最近一次修改的时间相关的知识,希望对你有一定的参考价值。

前言

由于看到一篇回答提到文件打开可能被发现的问题,所以有了本篇文章,用于解决t看文件后,修改文件访问时间等信息,达到不被发现的目的。那么话不多说,直接开始。
参考文章:
Windows核心编程-CreateFile详解
Windows API
(C语言)修改文件时间程序(创建时间、修改时间、访问时间)

工程下载

码云 github

效果图

管理员权限运行exe程序,输入文件绝对或相对路径,输入各个时间,回车即可。
在这里插入图片描述

代码

change_file_time.c
编译直接gcc完事

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    // 文件绝对路径
    char filepath[1024] = {};
    // 文件的创建时间
    char CreationTime[21] = {};
    // 文件上一次访问的时间
    char LastAccessTime[21] = {};
    // 文件最近一次修改的时间
    char LastWriteTime[21] = {};
    // 年月日时分秒
    int year = 2000;
    int month = 1;
    int day = 1;
    int hour = 0;
    int minute = 0;
    int sec = 0;

    // 用于时间转换存储的变量
    SYSTEMTIME temp_time;

    // 修改编码
    system("chcp 65001");

    printf("请输入文件绝对或相对路径(回车结束) :");
    gets(filepath);
    //scanf("%s", filepath);

    /* 
        打开文件句柄 
        允许对设备进行只写访问
        如果有其他对象要用该设备,我们要求它们不得修改设备的数据;
        如果有其他内核对象要使用该设备,则要求它们不得读取设备的数据;
        告诉CreateFile打开一个已有的文件或设备,如果文件或设备不存在,那么CreateFile调用会失败
        告诉系统忽略文件的重解析属性(重解析属性允许一个文件系统过滤器对打开文件、读取文件、写入文件以及关闭文件这些行为进行修改)
    */
    HANDLE hFile = CreateFile(filepath, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT, NULL);

    if (hFile == INVALID_HANDLE_VALUE)
    {
        printf("打开文件句柄失败,错误:%s\\n", GetLastError());
        system("pause");
        return -1;
    }
    else
    {
        printf("文件打开成功\\r\\n");
    }

    printf("日期输入格式为:年-月-日 时:分:秒 (注意为英文,输入完后回车,例:2020-01-01 00:00:00)\\r\\n");
    printf("请输入新的创建时间 :");
    gets(CreationTime);
    //scanf("%s", CreationTime);
    printf("请输入新的上一次访问的时间 :");
    gets(LastAccessTime);
    //scanf("%s", LastAccessTime);
    printf("请输入新的最近一次修改的时间 :");
    gets(LastWriteTime);
    //scanf("%s", LastWriteTime);

    // 定义FILETIME变量 用于存储设置时间的变量
    FILETIME ft, LocalFileTime1, LocalFileTime2, LocalFileTime3;

    // 星期 方便起见用0表示周日
    temp_time.wDayOfWeek = 0;
    // 毫秒
    temp_time.wMilliseconds = 0;

    // 解析字符串 写入temp_time变量
    sscanf(CreationTime, "%d-%d-%d %d:%d:%d", &temp_time.wYear, &temp_time.wMonth, &temp_time.wDay, 
        &temp_time.wHour, &temp_time.wMinute, &temp_time.wSecond);
    // 根据一个FILETIME结构的内容,载入一个SYSTEMTIME结构
    SystemTimeToFileTime(&temp_time, &ft);
    // 此函数根据UTC将本地文件时间转换为文件时间
    LocalFileTimeToFileTime(&ft, &LocalFileTime1);

    sscanf(LastAccessTime, "%d-%d-%d %d:%d:%d", &temp_time.wYear, &temp_time.wMonth, &temp_time.wDay, 
        &temp_time.wHour, &temp_time.wMinute, &temp_time.wSecond);
    SystemTimeToFileTime(&temp_time, &ft);
    LocalFileTimeToFileTime(&ft, &LocalFileTime2);

    sscanf(LastWriteTime, "%d-%d-%d %d:%d:%d", &temp_time.wYear, &temp_time.wMonth, &temp_time.wDay, 
        &temp_time.wHour, &temp_time.wMinute, &temp_time.wSecond);
    SystemTimeToFileTime(&temp_time, &ft);
    LocalFileTimeToFileTime(&ft, &LocalFileTime3);

    // 设置文件时间
    if(SetFileTime(hFile, &LocalFileTime1, &LocalFileTime2, &LocalFileTime3))
    {
        printf("修改文件时间成功!\\r\\n");
    }
    else
    {
        printf("修改文件时间失败,错误:%s\\r\\n", GetLastError());
        system("pause");
        return -1;
    }

    // 关闭文件句柄
    CloseHandle(hFile);

    system("pause");
    return 0;
}

函数具体解析

CreateFile

在这里插入图片描述

SystemTimeToFileTime

在这里插入图片描述

LocalFileTimeToFileTime

在这里插入图片描述

SetFileTime

在这里插入图片描述

以上是关于C语言实现 修改文件的创建时间,上一次访问的时间,最近一次修改的时间的主要内容,如果未能解决你的问题,请参考以下文章

Python获取或修改 Windows 系统中文件的创建时间修改时间和访问时间(os | win32file)

Python获取或修改 Windows 系统中文件的创建时间修改时间和访问时间(os | win32file)

Python获取或修改 Windows 系统中文件的创建时间修改时间和访问时间(os | win32file)

linux下C语言怎么获取文件创建时间?

Linux文件管理系统-文件操作

Find命令查找最近几天修改的文件