c++ - 在Qt中修改文件的lastModified/lastAccessed/created日期

标签 c++ qt fileapi qfile

我有一个复制一些文件的应用程序,但在复制过程中,最后修改的日期等更改为当前日期和时间。在一些论坛上,我看到建议使用 SETFILETIME调用fileapi.hMS docs 上指定的。

但是,快速搜索显示这些功能可以在 QFileDevice 中找到。可以在哪里使用 setFileTime具有以下功能 FileTime枚举。注意,QFileQFileInfo不允许修改这些日期和时间,只能读取这些日期和时间。

QFileDevice::FileAccessTime 0 When the file was most recently accessed (e.g. read or written to). QFileDevice::FileBirthTime 1 When the file was created (may not be not supported on UNIX). QFileDevice::FileMetadataChangeTime 2 When the file's metadata was last changed. QFileDevice::FileModificationTime 3 When the file was most recently modified.

我怎样才能获得这个QFileDevice的实例来自说 QFileInfo对象,甚至是 QFile对象(在本例中, QFile 继承自 QFileDevice - 例如 static_cast<>() 有帮助吗?

或者,我应该使用 Windows FileAPI.h - 我怎样才能从某个文件位置和 QDateTime 做到这一点修改createdlastModified时间?

最佳答案

我必须承认我注意到QFile::setFileTime()第一次是因为OP的问题。 (我从来没有必要调整我的软件编写的任何文件的时间戳。)出于好奇,我试图解决这个问题。

这就是我得到的:

// Qt header:
#include <QtCore>

// main application
int main(int argc, char **argv)
{
  auto showTimeStamps = [](const QFile &file) {
    qDebug() << "File time stamps of" << file.fileName();
    QFileInfo fileInfo(file);
    qDebug() << "birthTime()   :" << fileInfo.birthTime();
    qDebug() << "lastModified():" << fileInfo.lastModified();
    qDebug() << "lastAccessed():" << fileInfo.lastRead();
  };

  qDebug() << "Qt Version:" << QT_VERSION_STR;
  { QFile file("test.txt");
    // create test file
    qDebug() << "Write test.txt...";
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
      qDebug() << "Failed to create test.txt!";
      return 1;
    }
    if (file.write("Test.\n") < 0) {
      qDebug() << "Failed to write to test.txt!";
      return 1;
    }
    file.close();
    qDebug() << "Done.";
    // check file time stamps initially
    showTimeStamps(file);
    // manipulate file time stamps
    const QDateTime timeStamp(QDate(1970, 5, 1), QTime(6, 0));
    qDebug() << "Modify time stamp of creation of test.txt:";
    if (!file.open(QIODevice::Append | QIODevice::Text)) {
      qDebug() << "Failed to open test.txt!";
      return 1;
    }
    if (!file.setFileTime(timeStamp, QFileDevice::FileBirthTime)) {
      qDebug() << "Failed to modify create time!";
      return 1;
    }
    file.close();
    showTimeStamps(file);
    qDebug() << "Modify time stamp of last modification of test.txt:";
    if (!file.open(QIODevice::Append | QIODevice::Text)) {
      qDebug() << "Failed to open test.txt!";
      return 1;
    }
    if (!file.setFileTime(timeStamp, QFileDevice::FileModificationTime)) {
      qDebug() << "Failed to modify last modified time!";
      return 1;
    }
    file.close();
    showTimeStamps(file);
    qDebug() << "Modify time stamp of last access of test.txt:";
    file.setFileTime(timeStamp, QFileDevice::FileAccessTime);
    if (!file.open(QIODevice::Append | QIODevice::Text)) {
      qDebug() << "Failed to open test.txt!";
      return 1;
    }
    if (!file.setFileTime(timeStamp, QFileDevice::FileAccessTime)) {
      qDebug() << "Failed to modify last access time!";
      return 1;
    }
    file.close();
    showTimeStamps(file);
  }
  // bail out to enable check in File Explorer afterwards
  return 0;
  // delete test file
  { qDebug() << "Delete test.txt...";
    if (!QFile::remove("test.txt")) {
      qDebug() << "Failed to delete test.txt!";
      return 1;
    }
    qDebug() << "Done.";
  }
}

输出:

Qt Version: 5.13.0
Write test.txt...
Done.
File time stamps of "test.txt"
birthTime()   : QDateTime(2020-06-18 08:42:09.983 Mitteleuropõische Sommerzeit Qt::LocalTime)
lastModified(): QDateTime(2020-06-18 08:42:09.984 Mitteleuropõische Sommerzeit Qt::LocalTime)
lastAccessed(): QDateTime(2020-06-18 08:42:09.983 Mitteleuropõische Sommerzeit Qt::LocalTime)
Modify time stamp of creation of test.txt:
File time stamps of "test.txt"
birthTime()   : QDateTime(1970-05-01 06:00:00.000 Mitteleuropõische Sommerzeit Qt::LocalTime)
lastModified(): QDateTime(2020-06-18 08:42:09.984 Mitteleuropõische Sommerzeit Qt::LocalTime)
lastAccessed(): QDateTime(2020-06-18 08:42:09.983 Mitteleuropõische Sommerzeit Qt::LocalTime)
Modify time stamp of last modification of test.txt:
File time stamps of "test.txt"
birthTime()   : QDateTime(1970-05-01 06:00:00.000 Mitteleuropõische Sommerzeit Qt::LocalTime)
lastModified(): QDateTime(1970-05-01 06:00:00.000 Mitteleuropõische Sommerzeit Qt::LocalTime)
lastAccessed(): QDateTime(2020-06-18 08:42:09.983 Mitteleuropõische Sommerzeit Qt::LocalTime)
Modify time stamp of last access of test.txt:
File time stamps of "test.txt"
birthTime()   : QDateTime(1970-05-01 06:00:00.000 Mitteleuropõische Sommerzeit Qt::LocalTime)
lastModified(): QDateTime(1970-05-01 06:00:00.000 Mitteleuropõische Sommerzeit Qt::LocalTime)
lastAccessed(): QDateTime(1970-05-01 06:00:00.000 Mitteleuropõische Sommerzeit Qt::LocalTime)

之后我验证了 Windows 文件资源管理器中的时间戳:

snapshot of File Properties for test.txt

所以,我想知道OP的说法

Note, QFile or QFileInfo does not allow modifying these dates & times, only reading these dates & times.

我原以为这就是 QFile::setFileTime() 的实际意图,而且它似乎在我这边工作正常。

关于c++ - 在Qt中修改文件的lastModified/lastAccessed/created日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62441844/

相关文章:

c++ - std::map 和二叉搜索树

c++ - 如何在C++中将ifstream和ofstream传递给相同的函数对象?

c++ - QMetaObject::invokeMethod(object, method, stuff+params) 与 object->method()

c++ - 按钮连接Qt失败

javascript - 是否可以使用javascript从浏览器中的sd卡读取文件系统

javascript - 如何从对象 URL 获取文件或 blob?

c++ - 阴影贴图产生不正确的结果

c++ - g++ c++17 类模板参数推导在非常特殊的情况下不起作用

c++ - QString.arg 函数

php - 通过表单将文件上传到 Drupal 7 后,如何获取文件的路径?