gpt4 book ai didi

c++ - Qt - 如何在 30 天后删除日志文件且文件名不固定

转载 作者:太空宇宙 更新时间:2023-11-04 13:01:43 24 4
gpt4 key购买 nike

我需要删除 30 天后在文件夹中创建的日志文件。这些文件是使用以下代码创建的:

QDateTime local(QDateTime::currentDateTime());
QString dir = QCoreApplication::applicationDirPath();
dir = dir+"/log/";
QString filename = dir+"console_"+local.date().toString("yyyyMMdd")+QString("_%1").arg(logPostfix,3, 10, QChar('0'))+".log";
QFile file(filename);

因此,日志文件将被命名为 console_currentDate_000.log。现在,我想在 30 天后删除文件夹中的那些文件。如何检查确切的文件名并在 30 天后将其删除。我想检查确切文件名的原因是,如果我重命名文件名,它不会删除文件。意思是,我想保留日志文件。例如,keep_console_Date_000.log 或 console_Date_000_keep.log。下面是我试过的代码,但我不知道如何检查确切的文件名或模式。

void deleteoldfiles()
{
QDate day(QDate::currentDate());
day = day.addDays(-30); // Set for previous 30 days

QString path = QCoreApplication::applicationDirPath();
path = path+"/log/";

QString filename = QString("console_????????_%1.log").arg(logPostfix,3, 10, QChar('0'));

QDir dir(path);
QFileInfoList result = dir.entryInfoList( QDir::Files, QDir::DirsFirst);

for(int i=0; i<result.size(); i++)
{
QFileInfo file = result.at(i);
if(result.at(i).fileName() == filename)
{
QDate filecreated = result.at(i).created().date();

if(filecreated.daysTo(day)>0)
{
QString filepath = file.absoluteFilePath();
QDir deletefile;
deletefile.setPath(filepath);
deletefile.remove(filepath);
print_log("File "+filepath+" is deleted!!");
}
}
}
}

最佳答案

您可以使用 QDir::entryInfoList 方法的另一个重载,它接收名称过滤器参数列表。另外,看看 wildcards matching

void deleteoldfiles(int days)
{
const QDate today = QDate::currentDate();
const QString path = QCoreApplication::applicationDirPath() + "/log/";

QString filter("console_%1%1%1%1%1%1%1%1_%1%1%1.log"); // pattern
filter = filter.arg("[0123456789]"); // valid characters

Q_FOREACH (auto fileInfo, QDir(path).entryInfoList(QStringList(filter), QDir::Files)) {
if (fileInfo.created().date().daysTo(today) > days) {
QString filepath = fileInfo.absoluteFilePath();
QDir deletefile;
deletefile.setPath(filepath);
deletefile.remove(filepath);
qDebug() << "File " + filepath + " is deleted!";
}
}
}

如果您只是想删除除包含keep 字符串的文件以外的所有内容,可以简化为

void deleteoldfiles(int days)
{
const QDate today = QDate::currentDate();
const QString path = QCoreApplication::applicationDirPath() + "/log/";

Q_FOREACH (auto fileInfo, QDir(path).entryInfoList(QStringList("console_*.log"), QDir::Files)) {
if (fileInfo.fileName().contains("keep")) continue;
if (fileInfo.created().date().daysTo(today) > days) {
QString filepath = fileInfo.absoluteFilePath();
QDir deletefile;
deletefile.setPath(filepath);
deletefile.remove(filepath);
qDebug() << "File " + filepath + " is deleted!";
}
}
}

PS:另一个处理日志的好选择是 boost::log ,设置起来有点复杂,但有许多强大的选项,包括文件收集器,它可以自动为您完成这项工作。

关于c++ - Qt - 如何在 30 天后删除日志文件且文件名不固定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43934419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com