Удаление элементов в папке после X элементов, из самых старых, в Qt - PullRequest
0 голосов
/ 19 декабря 2018

По сути, у меня есть каталог, в котором я хочу сохранить максимум X элементов, и после этого каждый добавленный файл должен инициировать удаление самого старого сохраненного элемента.Поэтому я решил упорядочить их по времени в QFileInfoList, но, к сожалению, это зависит от системного времени (если пользователь переключит часы на Y часов, последние добавленные файлы будут считаться самыми старыми и, следовательно, удаляться).Вот что я написал до сих пор с проблемой системного времени:

void namespace::cleanStationLogoDir()
{
    QDir dir(DIR);
    if(!dir.exists())
    {
        //Create directory
        if(dir.mkpath(DIR))
        {
            //Ok result
        }
        else
        {
            qDebug() << "Unable to create dir.";
        }
    }

    QFileInfoList files = dir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot, QDir::Time);
    qDebug() << "files size: " << files.size();

    while(files.size() > X)
    {
        qDebug() << "Removed last element" << files.last().filePath();
        dir.remove(files.takeLast().filePath());
        qDebug() << "files size: " << logo_files.size();
    }
}

Знаете ли вы какой-нибудь другой способ сделать это?Я подумал о добавлении добавочного идентификатора к имени файлов во время их хранения, но после файлов max_INT это может оказаться проблемой, или если я перенесу идентификаторы в элементы X, то я не уверен, какие удалить на следующемфайл получен.

1 Ответ

0 голосов
/ 05 февраля 2019

1) Вы можете использовать время эпохи как часть вашего имени файла вместо использования произвольной переменной приращения, которая никогда не будет явно сбрасываться или повторно использоваться.

2) Вы можете использовать QFileInfo, как вы можете изменить свой существующийлогика как

QFileInfoList files = dir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot, QDir::Time | QDir::Reversed);
const int  MAX_NUM_FILES_TO_RETAIN = 10

for(int index = files.size(); index > MAX_NUM_FILES_TO_RETAIN; --index)
{
     const QFileInfo& info = files.at(index -1);
     QFile::remove(info.absoluteFilePath());
}

Код удалит старые файлы, сохранив последние 10 файлов.

...