QT修改文件的创建、修改、访问时间

前言

本文展示了在Windows环境下基于QT的对文件的创建、修改、访问时间进行修改的方法。
引入windows.h,主要利用GetFileTimeSetFileTime这两个API。

代码介绍

这里主要写了4个函数,分别用于数据转换和数据读写。
文件路径使用QT的QString类型,QT的时间使用其QDateTime类型,文件的时间使用系统的FILETIME类型。
前两个函数就是QDateTime和FILETIME的互相转换,主要利用了FileTimeToSystemTimeSystemTimeToFileTime
FileTimeToLocalFileTime、LocalFileTimeToFileTime
这4个API,注意前两个API是不考虑时差的转换,因此还需要后两个API来完成和本地时间的转换。
后两个函数就是获取设置文件的时间。注意假如函数参数里某个QDateTime的指针为空,则忽略对这一项的操作。

代码

H文件
#include <QWidget>
#include "windows.h"
#include <iostream>
#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QFileDialog>

QDateTime Filetime2QDatetime(FILETIME ft);//文件时间转QT时间
FILETIME QDatetime2Filetime(QDateTime qdt);//QT时间转文件时间
uint8_t qGetFileTime(QString path, QDateTime *qdtC, QDateTime *qdtM, QDateTime *qdtA);//获取文件时间
uint8_t qSetFileTime(QString path, QDateTime *qdtC, QDateTime *qdtM, QDateTime *qdtA);//设置文件时间
CPP文件
QDateTime Filetime2QDatetime(FILETIME ft)//文件时间转QT时间
{
    FILETIME lft;
    FileTimeToLocalFileTime(&ft, &lft);//文件时间转本地文件时间
    SYSTEMTIME st;
    FileTimeToSystemTime(&lft, &st);//本地文件时间转系统时间
    QDateTime qdt;
    qdt.setDate(QDate(st.wYear, st.wMonth, st.wDay));//设置年月日
    qdt.setTime(QTime(st.wHour, st.wMinute, st.wSecond));//设置时分秒
    return qdt;
}

FILETIME QDatetime2Filetime(QDateTime qdt)//QT时间转文件时间
{
    SYSTEMTIME st;
    st.wYear = qdt.date().year();
    st.wMonth = qdt.date().month();
    st.wDay = qdt.date().day();
    st.wDayOfWeek = qdt.date().dayOfWeek();
    st.wHour = qdt.time().hour();
    st.wMinute = qdt.time().minute();
    st.wSecond = qdt.time().second();
    st.wMilliseconds = qdt.time().msec();
    FILETIME lft;
    SystemTimeToFileTime(&st, &lft);//系统时间转本地文件时间
    FILETIME ft;
    LocalFileTimeToFileTime(&lft, &ft);//本地文件时间转文件时间
    return ft;
}

uint8_t qGetFileTime(QString path, QDateTime *qdtC, QDateTime *qdtM, QDateTime *qdtA)//获取文件时间
{
    if(path.isEmpty()) return 1;//若路径为空
    QFile file(path);//创建文件对象
    if(!file.exists()) return 2;//若文件不存在
    QFileInfo fileinfo = QFileInfo(path);//文件信息
    if(qdtC) *qdtC = fileinfo.created();//创建时间
    if(qdtM) *qdtM = fileinfo.lastModified();//修改时间
    if(qdtA) *qdtA = fileinfo.lastRead();//访问时间
    return 0;
}

uint8_t qSetFileTime(QString path, QDateTime *qdtC, QDateTime *qdtM, QDateTime *qdtA)//设置文件时间
{
    if(path.isEmpty()) return 1;//若路径为空
    
    HANDLE hFile;//文件句柄
    QString url = path;//文件路径
    hFile = CreateFileW(url.toStdWString().data(), GENERIC_READ | GENERIC_WRITE, 
            FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    FILETIME lpCreationTime;//创建时间
    FILETIME lpLastAccessTime;//访问时间
    FILETIME lpLastWriteTime;//修改时间
    if(!GetFileTime(hFile, &lpCreationTime, &lpLastAccessTime, &lpLastWriteTime)){//获取时间信息
        return 2;//获取原时间失败
    }
    
    if(qdtC){//修改创建时间
        lpCreationTime = QDatetime2Filetime(*qdtC);
    }
    if(qdtM){//修改修改时间
        lpLastWriteTime = QDatetime2Filetime(*qdtM);
    }
    if(qdtA){//修改访问时间
        lpLastAccessTime = QDatetime2Filetime(*qdtA);
    }
    
    if(!SetFileTime(hFile, &lpCreationTime, &lpLastAccessTime, &lpLastWriteTime)){//设置时间信息
        return 3;//设置时间失败
    }
    return 0;
}
  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值