Работа с файлами в 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 шт):
В 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);