Работа с файлами в Qt C++

Написал вот такую ротацию логов в своей программе.

QFileInfo log("log.txt");
int currentM = QDate::currentDate().month();
int createM = log.created().toString("MM").toInt();
if (createM != 0)
{
    if (currentM > createM)
    {
        char oldn[] = "log.txt";
        char newn[] = "oldlog.txt";
        QFile::remove(newn);
        QFile::rename(oldn, newn);
    }
}
fileDebug = fopen("log.txt", "a+t");
fprintf(fileDebug, %s Log started\n, QDateTime:: currentDateTime().toString("hh:mm:ss dd.MM.yyyy").toLocal8Bit().constData());
qInstallMessageHandler(myMessageOutput);

Каждый месяц лог, который записывался, переименовывается в oldlog, старый oldlog перед этим удаляется. Затем программа создает новый файл с именем log, и пишет уже в него.

Проблема состоит в том, что новый файл log.txt создаётся с датой создания старого лога, и я не могу понять почему.

При этом, если оба лога удалить - и старый, и новый - то есть программе нечего будет удалять и переименовывать, она создаст новый лог с нормальной датой создания.

Проверял, что remove и rename точно работают. Пробовал добавлять деструктор класса QFileInfo сразу после получения даты - не помогло.

Почему программа так делает? Как заставить её создавать файл с правдивой датой создания?


Ответы (1 шт):

Автор решения: maestro

В Qt нет инструментов для изменения даты файла, но это можно сделать средствами WinAPI. Тогда файл придётся создавать не с помощью fopen, а с помощью CreateFileA. Функция для изменения времени: SetFileTime.

#include <Windows.h>

HANDLE file = CreateFileA("D:\\1.txt", GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (file == INVALID_HANDLE_VALUE)
{
   // Failed to create file
   return 2;
}
FILETIME time;
GetFileTime(file, &time, NULL, NULL);
time.dwHighDateTime -= 1500;
//                создан, открыт, изменён
SetFileTime(file, &time, &time, &time);
→ Ссылка