Windows下使用C/C++修改文件时间

背景

在某些特定场景下,会有修改文件创建时间、修改时间的需求。具体为什么要修改文件时间就不去纠结了,感兴趣的可以去做个问卷调查,也可以自行脑补,反正经常有小伙伴问怎么去修改文件时间。

最简单的解决方案

文件的时间作为文件的属性,当然是由文件的编辑工具生成或修改的。那么最简单的方式就是把你的系统时间设置为想要改的时间点,比如设置为2000年1月1日的某个时间点,然后打开文件编辑工具,随便修改点内容,比如在某个位置敲一个字符然后删除并保存,虽然文件的内容没变,但是文件的修改时间已经变为2000年1月1日。然而你会发现,文件的创建时间没有更改,所以你需要将文件另存为某个文件,你就会发现另存为的文件的创建时间变成了你想要的时间。这个时候你就可以拿这个另存为的文件去交差了,一切很简单。

缺点
1、修改系统时间很简单,但是总是不想改,嫌麻烦。
2、需要修改或另存为文件,批量修改文件时间不被累死就被烦死。
3、有些文件压根就找不到对应的编辑工具,谈何修改或另存为。
4、太低效。

最简单高效的解决方案

最简单高效的方式,当然是调用系统接口,直接修改文件时间为自己指定的时间。

原理

在windows系统中,修改文件的时间属性一般都是调用API直接修改,C/C++ API如下:

BOOL SetFileTime(
  HANDLE         hFile,
  CONST FILETIME *lpCreationTime,
  CONST FILETIME *lpLastAccessTime,
  CONST FILETIME *lpLastWriteTime
);

详细的API说明在微软官方文档页面上有介绍,可以自行到微软官方文档页面进行搜索查询。

实现Demo

以下采用C语言实现,以便参考,读者可以采用自己擅长的语言自行实现。

#include "windows.h"
#include "stdio.h"
#include "stdlib.h"

int main(int argc, char *argv[]) {
    // 传参格式: 可执行程序.exe fileName time
    // 传参示例:App.exe test.txt 2018-09-04 20:28:50

    // 参数检查
    if( argc != 4 ) {
        printf("Use format: %s fileName time\nUse like: %s test.txt 2018-09-04 20:28:50\n", argv[0], argv[0]);
        return -1;
    }

    // 检查时间格式
    if( strlen(argv[2]) != 10 || strlen(argv[3]) != 8 ) {
        printf("Time format is invalid, time format like: 2018-09-04 20:28:50\n");
        return -1;
    }

    // 读取指定时间
    SYSTEMTIME spec_time;
    sscanf(argv[2],"%d-%d-%d", &spec_time.wYear, &spec_time.wMonth, &spec_time.wDay);
    sscanf(argv[3],"%d:%d:%d", &spec_time.wHour, &spec_time.wMinute, &spec_time.wSecond);
    spec_time.wDayOfWeek    = 1;
    spec_time.wMilliseconds = 0;
    // TODO: 此处省略对时间有效性的校验

    // 获取文件句柄
    HANDLE hFile = CreateFile(argv[1],      // LPCTSTR lpFileName,
        GENERIC_READ|GENERIC_WRITE,         // DWORD dwDesiredAccess,
        FILE_SHARE_READ|FILE_SHARE_DELETE,
        NULL,                               // LPSECURITY_ATTRIBUTES lpSecurityAttributes,
        OPEN_EXISTING,
        FILE_FLAG_BACKUP_SEMANTICS,         // DWORD dwFlagsAndAttributes,
        NULL);

    if( hFile == INVALID_HANDLE_VALUE ) {
        printf("Get file handle failed, error = %s\n", GetLastError());
        return -1;
    }

    // 设置文件时间
    FILETIME ft,LocalFileTime;
    SystemTimeToFileTime(&spec_time, &ft);
    LocalFileTimeToFileTime(&ft,&LocalFileTime);

    if(SetFileTime(hFile,&LocalFileTime,(LPFILETIME) NULL,&LocalFileTime)) {
        printf("Set file time success\n");
    }else{
        printf("Set file time failed\n");
    }
    CloseHandle(hFile);
    return 0;
}
C++ 本身并不支持对文件设置有效期的功能。但是,你可以通过编写一些额外的代码来实现。例如,你可以创建一个函数,该函数检查文件的创建时间修改时间,并根据这些时间来判断文件是否过期。如果文件过期,则可以选择将其删除或者对其进行其他处理。下面是一个示例代码: ```c++ #include <iostream> #include <filesystem> #include <chrono> namespace fs = std::filesystem; using namespace std::chrono; // 检查文件是否过期 bool isExpired(const std::string& filePath, int expirationDays) { auto lastWriteTime = fs::last_write_time(filePath); auto now = system_clock::now(); auto diff = duration_cast<days>(now - lastWriteTime); return diff.count() > expirationDays; } int main() { // 定义文件路径和有效期 std::string filePath = "path/to/file"; int expirationDays = 30; // 检查文件是否过期 if (isExpired(filePath, expirationDays)) { // 文件过期,进行处理 std::cout << "File is expired, deleting..." << std::endl; fs::remove(filePath); } else { // 文件未过期,继续执行其他操作 std::cout << "File is not expired, continuing..." << std::endl; } return 0; } ``` 在上面的代码中,`isExpired` 函数用于检查文件是否过期。该函数使用 `std::filesystem` 库中的 `last_write_time` 函数获取文件的最后修改时间,然后使用 `std::chrono` 库中的时间差函数计算文件最后修改时间与当前时间的差值,最后将差值转换为天数进行比较。如果文件的有效期已经过期,则返回 `true`,否则返回 `false`。 在示例代码中,我们假设文件的有效期为30天。如果文件过期,则删除该文件;如果文件未过期,则继续执行其他操作。你可以根据需要修改代码来实现你的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值