前言
本文展示了在Windows环境下基于QT的对文件的创建、修改、访问时间进行修改的方法。
引入windows.h,主要利用GetFileTime和SetFileTime这两个API。
代码介绍
这里主要写了4个函数,分别用于数据转换和数据读写。
文件路径使用QT的QString类型,QT的时间使用其QDateTime类型,文件的时间使用系统的FILETIME类型。
前两个函数就是QDateTime和FILETIME的互相转换,主要利用了FileTimeToSystemTime、SystemTimeToFileTime
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;
}