Improve precision of reported file times on Unix-style platforms

Instead of reporting the file times in the precision of seconds, our API allows
us to report it up to millisecond precision.

Change-Id: I8bcc6a1fb4116e8c5421d650a68f6fb00482e551
Reviewed-by: Alex Trotsenko <alex1973tr@gmail.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
bb10
Simon Hausmann 2016-07-19 15:44:58 +02:00 committed by Simon Hausmann
parent 6e21c3fafd
commit 494ced1329
2 changed files with 31 additions and 9 deletions

View File

@ -227,14 +227,27 @@ static void fillStat64fromStat32(struct stat64 *statBuf64, const struct stat &st
{
statBuf64->st_mode = statBuf32.st_mode;
statBuf64->st_size = statBuf32.st_size;
#if _POSIX_VERSION >= 200809L
statBuf64->st_ctim = statBuf32.st_ctim;
statBuf64->st_mtim = statBuf32.st_mtim;
statBuf64->st_atim = statBuf32.st_atim;
#else
statBuf64->st_ctime = statBuf32.st_ctime;
statBuf64->st_mtime = statBuf32.st_mtime;
statBuf64->st_atime = statBuf32.st_atime;
#endif
statBuf64->st_uid = statBuf32.st_uid;
statBuf64->st_gid = statBuf32.st_gid;
}
#endif
#if _POSIX_VERSION >= 200809L
static qint64 timespecToMSecs(const timespec &spec)
{
return (qint64(spec.tv_sec) * 1000) + (spec.tv_nsec / 1000000);
}
#endif
void QFileSystemMetaData::fillFromStatBuf(const QT_STATBUF &statBuffer)
{
// Permissions
@ -278,9 +291,17 @@ void QFileSystemMetaData::fillFromStatBuf(const QT_STATBUF &statBuffer)
#endif
// Times
creationTime_ = statBuffer.st_ctime ? statBuffer.st_ctime : statBuffer.st_mtime;
modificationTime_ = statBuffer.st_mtime;
accessTime_ = statBuffer.st_atime;
#if _POSIX_VERSION >= 200809L
modificationTime_ = timespecToMSecs(statBuffer.st_mtim);
creationTime_ = timespecToMSecs(statBuffer.st_ctim);
if (!creationTime_)
creationTime_ = modificationTime_;
accessTime_ = timespecToMSecs(statBuffer.st_atim);
#else
creationTime_ = qint64(statBuffer.st_ctime ? statBuffer.st_ctime : statBuffer.st_mtime) * 1000;
modificationTime_ = qint64(statBuffer.st_mtime) * 1000;
accessTime_ = qint64(statBuffer.st_atime) * 1000;
#endif
userId_ = statBuffer.st_uid;
groupId_ = statBuffer.st_gid;
}

View File

@ -237,9 +237,10 @@ private:
FILETIME lastAccessTime_;
FILETIME lastWriteTime_;
#else
time_t creationTime_;
time_t modificationTime_;
time_t accessTime_;
// msec precision
qint64 creationTime_;
qint64 modificationTime_;
qint64 accessTime_;
uint userId_;
uint groupId_;
@ -276,9 +277,9 @@ inline QDateTime QFileSystemMetaData::fileTime(QAbstractFileEngine::FileTime tim
#endif
#if defined(Q_OS_UNIX)
inline QDateTime QFileSystemMetaData::creationTime() const { return QDateTime::fromSecsSinceEpoch(creationTime_); }
inline QDateTime QFileSystemMetaData::modificationTime() const { return QDateTime::fromSecsSinceEpoch(modificationTime_); }
inline QDateTime QFileSystemMetaData::accessTime() const { return QDateTime::fromSecsSinceEpoch(accessTime_); }
inline QDateTime QFileSystemMetaData::creationTime() const { return QDateTime::fromMSecsSinceEpoch(creationTime_); }
inline QDateTime QFileSystemMetaData::modificationTime() const { return QDateTime::fromMSecsSinceEpoch(modificationTime_); }
inline QDateTime QFileSystemMetaData::accessTime() const { return QDateTime::fromMSecsSinceEpoch(accessTime_); }
inline uint QFileSystemMetaData::userId() const { return userId_; }
inline uint QFileSystemMetaData::groupId() const { return groupId_; }