如何解决将复制文件的QDateTime调整为源文件的QDateTime
上下文:
我有一个应用程序,可以搜索目录中的文件并复制特定文件。
问题:
使用FileCopyExW
,我已成功将文件复制到新位置,但是文件的日期和时间不匹配,可能会延迟一秒钟或更长时间,如下例所示。
尝试用源文件的名称(有时)修改覆盖目标文件的QDateTime
不能正确写入日期,如下面的示例所示。
调试器的屏幕截图
此文件的日志输出
09:34:50.731 Warning: File times do not match
09:34:50.731 Warning: Birth time differene: 0
09:34:50.731 Warning: Last Access time differene: 483
09:42:02.660 Warning: Last Modified time differene: 483
09:42:02.660 Debug:
输出其他随机失败的文件
09:43:48.831 Warning: File times do not match
09:43:48.831 Warning: Birth time differene: -7
09:43:48.831 Warning: Last Access time differene: 1462
09:44:53.602 Warning: Last Modified time differene: 0
09:44:53.602 Debug:
有什么想法会发生这种情况以及如何解决?
代码示例:
// File copied successfully at this point,now adjust file times as these may not be accurate (why?)
QFile newFile(destination);
if (newFile.open(QIODevice::OpenModeFlag::WriteOnly | QIODevice::OpenModeFlag::Append)) {
// set file attributes,create,last write and last modified dates the same as original file
QFileInfo srcFi(storageFile.location);
// Set last modified date - most important
QDateTime localLastModified = srcFi.lastModified().toLocalTime();
if (!newFile.setFileTime(localLastModified,QFileDevice::FileModificationTime)) {
printWarningFileError(TAG,QString("Failed to set lastModified date for file at [%1]").arg(destination),&newFile);
}
// Set last accessed date
QDateTime localLastRead = srcFi.lastRead().toLocalTime();
if (!newFile.setFileTime(localLastRead,QFileDevice::FileAccessTime)) {
printWarningFileError(TAG,QString("Failed to set lastAccessed date for file at [%1]").arg(destination),&newFile);
}
// Set created date
QDateTime localBirthTime = srcFi.birthTime().toLocalTime();
if (!newFile.setFileTime(localBirthTime,QFileDevice::FileBirthTime)) {
printWarningFileError(TAG,QString("Failed to set created date for file at [%1]").arg(destination),&newFile);
}
// Ensure we write out content before closing file (not really necessary due to close() )
newFile.flush();
newFile.close();
// Read file & refresh meta data for checking
QFileInfo fiDest(destination);
fiDest.refresh();
// Read destination file date data
QDateTime destFileBirth = fiDest.birthTime();
QDateTime destFileAccess = fiDest.lastRead();
QDateTime destFileModified = fiDest.lastModified();
// Compare dates
bool birthTimeMatch = (destFileBirth != localBirthTime);
bool accessTimeMatch = (destFileAccess != localLastRead);
bool modifiedTimeMatch = (destFileModified != localLastModified);
if (!(birthTimeMatch && accessTimeMatch && modifiedTimeMatch)) {
qWarning() << "File times do not match";
qWarning() << "Birth time differene: " << (destFileBirth.toMSecsSinceEpoch() - localBirthTime.toMSecsSinceEpoch());
qWarning() << "Last Access time differene: " << (destFileAccess.toMSecsSinceEpoch() - localLastRead.toMSecsSinceEpoch());
qWarning() << "Last Modified time differene: " << (destFileModified.toMSecsSinceEpoch() - localLastModified.toMSecsSinceEpoch());
qDebug() << "";
}
else {
qDebug() << "All good";
}
}
else {
printWarningFileError(TAG,QString("Failed to open file for adjust dates [%1]").arg(destination),&newFile);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。