前言
本章程序功能
1.修改本地文件历史修改时间
2.修改本地文件历史访问时间
程序功能展示
程序源码
#include <QApplication>
#include <QDateTime>
#include <QDebug>
#include <QFileInfo>
#include "time.h"
#ifdef _WIN32
#include "sys/utime.h"
#else
#include "utime.h"
#endif
int ChangeFileDateTime(QDateTime lastModify,QDateTime lastRead,QString FilePathName)
{
//QDateTime LastModifyTime = QDateTime::fromString(lastModifiedDateTime, "yyyyMMdd hh:mm:ss");
//QDateTime lastRead = QDateTime::fromString(lastReadDateTime, "yyyyMMdd hh:mm:ss");
qDebug() << "ModifyFileDateTime" << lastModify << lastRead << FilePathName;
if(FilePathName.isEmpty() || !lastModify.isValid() || lastModify.isNull() || !lastRead.isValid() || lastRead.isNull())
return -1;
int aYear = lastModify.date().year()-1900;
int aMonth = lastModify.date().month()-1;
int aDay = lastModify.date().day();
int aHour = lastModify.time().hour();
int aMinute = lastModify.time().minute();
int aSec = lastModify.time().second();
struct tm modify = {0};
modify.tm_year = aYear;
modify.tm_mon = aMonth;
modify.tm_mday = aDay;
modify.tm_hour = aHour;
modify.tm_min = aMinute;
modify.tm_sec = aSec;
modify.tm_isdst = 0;
int cYear = lastRead.date().year()-1900;
int cMonth = lastRead.date().month()-1;
int cDay = lastRead.date().day();
int cHour = lastRead.time().hour();
int cMinute = lastRead.time().minute();
int cSec = lastRead.time().second();
struct tm read = {0};
read.tm_year = cYear;
read.tm_mon = cMonth;
read.tm_mday = cDay;
read.tm_hour = cHour;
read.tm_min = cMinute;
read.tm_sec = cSec;
read.tm_isdst = 0;
#ifdef _WIN32
struct _utimbuf ut;
#else
struct utimbuf ut;
#endif
//二者得同修修改,否则修改不成功
ut.modtime = mktime(&modify);// 最后修改时间
ut.actime=mktime(&read);//最后访问时间
//QByteArray ary=FilePathName.toUtf8();
QByteArray ary=FilePathName.toLocal8Bit();
//qDebug() << "ary" << ary;
char *fileName = ary.data();
int result=-1;
#ifdef _WIN32
result=_utime(fileName, &ut );
#else
result=utime(fileName, &ut );
#endif
return result;//-1表示修改失败
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QString fileName = "C:/Users/jbyyy/Desktop/录屏gif工具.exe";
QFileInfo fileInfo(fileName);
qDebug() << "历史修改时间" << fileInfo.lastModified();
qDebug() << "历史访问时间" << fileInfo.lastRead();
//修改历史修改时间 历史访问时间
int flag = ChangeFileDateTime(QDateTime(QDate(1997,11,8),QTime(13,14,21)),\
QDateTime(QDate(2001,8,12),QTime(13,14,21)),fileName);
qDebug() << "修改状态:" << flag;
fileInfo.refresh();
qDebug() << "历史修改时间" << fileInfo.lastModified();
qDebug() << "历史访问时间" << fileInfo.lastRead();
return a.exec();
}
存在问题
在win10上 程序中虽然显示历史访问时间修改成功,但是右键查看文件属性发现访问时间并没有修改成功,显示时间为调用_utime函数接口的时间点。
但在ubuntu系统中 历史修改时间和访问时间都修改成功