【问题标题】:Trigger signal when file size limit is reached达到文件大小限制时触发信号
【发布时间】:2017-01-06 23:43:00
【问题描述】:

我正在编写日志文件并希望将大小限制设置为 10 个月。

我正在考虑设置一个QTimer 每 X 分钟/小时触发一次 QFileInfo::refresh 并检查文件的大小。

是否有更好的方法来做到这一点?对我来说,使用 QTimer 听起来很痛苦并且耗费资源。我希望在达到限制大小时可以使用SIGNAL

【问题讨论】:

  • 由于您的代码正在写入,您可以只保留一个计数器来记录您到目前为止已写入的字节数(在每次写入后添加刚刚写入的字节数) .每次写入后,检查计数器是否刚刚超过您的阈值,如果是,则发出信号。
  • 这可能是一个解决方案。但是,编写部分是由第三方库完成的。我想保持它的代码不变。我只能访问该文件。
  • 但是,我可以在每次调用日志函数时检查文件的大小。
  • @GrégoireBorel "...每次我调用 log 函数" 那么,你为什么不跟踪传递给这个“log”函数的字节数?

标签: c++ qt signals qfileinfo


【解决方案1】:

简单而有效的解决方案是使用QFile::size()在写入日志文件后立即读取文件大小,并在大小超过时做出反应 极限。请注意,读取大小时必须打开文件。

void Logger::log(const QString &rLine)
{
    QFile f(logFileName());
    if (f.open(QIODevice::ReadWrite | QIODevice::Append | QIODevice::Text))
    {
        QTextStream out(&f);
        out << rLine << endl;
        qint64 f_size = f.size();
        f.close();
        checkFileSize(f_size);
    }
    else
    {
        QTextStream out(stdout);
        out << "CAN'T OPEN LOG FILE: " << logFileName();
    }
}

void Logger::checkFileSize(qint64 size)
{
    if (size <= maxFileSize())
    {
        return;
    }

    // Roll the log file or do whatever you wish like send a signal
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-17
    • 2019-05-23
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2011-04-05
    相关资源
    最近更新 更多