【问题标题】:Using QTextStream to read a file that is being written to?使用 QTextStream 读取正在写入的文件?
【发布时间】:2013-08-06 18:16:26
【问题描述】:

我目前像这样逐行从文件中读取数据

readFile(QFile *file)
{
    QTextStream in(file);
    while(!in.atEnd())
    {
        // Do stuff
    }
}

我需要扩展它来处理当前正在写入的文件。 while 循环只有在 N 秒内没有任何内容写入文件时才应退出。

这应该很容易通过添加一个计时器和一个睡眠/等待循环来实现,不断检查我们是否仍然是atEnd()。但是,the documentation 不是很清楚,如果新数据已附加到文件中,atEnd() 的返回值是否会发生变化。

如果我使用QTextStream 读取正在写入的文件,atEnd() 的返回值会准确反映文件内容的变化吗?

【问题讨论】:

  • 我认为更明智的做法是从内存中写入的缓冲区中读取。写入磁盘。
  • @ddriver - 我不确定我是否理解你的建议。我没有对磁盘进行任何写入。
  • 我明白了,那么其他进程正在写入?您可以通过简单地打开文件并检查写入后其大小是否增加来测试文件大小是否正确反映。这完全取决于文件大小是在最初打开文件时检查(更可能是 IMO)还是按需检查。
  • 最坏的情况,您可能需要在保留之前到达的位置的同时打开、读取、关闭、再次打开,以便从那里继续。
  • @CoryKlein Qt Creator 有 FS watching system,您可能会觉得有用。

标签: c++ file qt


【解决方案1】:

atEnd() 的返回值会准确反映文件内容的变化吗?

是的

您可以通过执行以下函数来测试:

void FileReader::_appendFileTest()
{    
    QFile file("/home/cklein/appendFile");
    file.open(QIODevice::ReadOnly);

    QTextStream in(&file);

    while(true)
    {
        while(!in.atEnd())
        {
            QString line = in.readLine();

            qDebug() << line;
        }
        SleepThread::msleep(1000);
    }
}

SleepThread 的代码取自 here。它只是暴露了受保护的QThread::msleep() 函数。

当应用程序运行时,在终端中输入这个

~ $ echo "foo" >> appendFile
~ $ echo "bar" >> appendFile

您可以看到,在不重置或重新打开文件的情况下,atEnd() 函数在附加文件时返回 false

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 2010-09-05
    • 2015-07-26
    • 1970-01-01
    • 2010-10-09
    相关资源
    最近更新 更多