QT 5.15.2中QDate::daysTo返回0问题求助
QT 5.15.2中文件创建时间
daysTo返回0的问题分析 核心问题根源
从调试信息能看到,birthTime()返回的时间仅包含毫秒数(如msecs=280348),缺少完整的年/月/日信息,导致提取出的date()和today是同一天,所以daysTo()必然返回0。主要原因有两点:
跨平台兼容性限制:
QT的birthTime()/created()在不同系统上的实现存在差异:- Linux下多数默认文件系统(如ext4)未开启创建时间记录,或者QT 5.15.2版本对Linux创建时间的读取支持不完善,无法获取完整时间戳。
- 部分平台上
QFileDevice::FileBirthTime枚举未能正确映射到系统原生的创建时间字段。
QFileInfo延迟加载机制:
QDir的entryInfoList()默认不会预加载所有文件属性,包括创建时间。如果未触发属性刷新,birthTime()会返回不完整的默认值。
解决方法
强制刷新文件属性
在访问创建时间前调用refresh(),确保加载完整的文件元数据:const QDate today = QDate::currentDate(); QDir dir("folderName"); foreach(auto fileInfo, dir.entryInfoList(QDir::Files)) { fileInfo.refresh(); // 强制刷新所有文件属性 int daysDiff = fileInfo.birthTime().date().daysTo(today); // 后续业务逻辑 }预加载时间属性
调用entryInfoList()时添加QDir::FileTime标志,让QT提前加载时间相关属性:auto fileInfos = dir.entryInfoList(QDir::Files | QDir::FileTime);平台针对性处理
- Windows平台:如果仍无法读取,可尝试直接调用Windows原生API(如
GetFileTime)获取创建时间。 - Linux平台:检查文件系统挂载参数是否开启创建时间记录(ext4需添加
inode64,user_xattr),若业务允许,也可以用lastModified()作为替代方案。
- Windows平台:如果仍无法读取,可尝试直接调用Windows原生API(如
校验时间有效性
先判断创建时间是否有效,避免处理无效数据:QDateTime birthTime = fileInfo.birthTime(); if (birthTime.isValid()) { int daysDiff = birthTime.date().daysTo(today); // 处理逻辑 } else { qDebug() << "无法读取文件创建时间:" << fileInfo.fileName(); }
内容的提问来源于stack exchange,提问作者Daddedebad
相关产品推荐
相关产品推荐

