Russian Qt Forum

Qt => Общие вопросы => Тема начата: NKovalev64 от Март 07, 2014, 11:08



Название: Чтение обновляемого файла
Отправлено: NKovalev64 от Март 07, 2014, 11:08
Есть задача считывать данные из постоянно обновляемого файла, например лог веб-сервера.
Есть ли какие то средства для решения этой задачи непосредственно в Qt?
Если нет, то как это можно сделать используя только средства С++?


Название: Re: Чтение обновляемого файла
Отправлено: Johnik от Март 07, 2014, 11:18
В Qt есть класс QFileSystemWatcher


Название: Re: Чтение обновляемого файла
Отправлено: NKovalev64 от Март 07, 2014, 11:52
В Qt есть класс QFileSystemWatcher

Так, ок. Допустим мы, используем этот, класс. Нам нужно оперативно считывать файл логa apache (например).
1. Открываем файл -> считываем до конца. Закрываем? Или можно держать открытым?
2. Добавляем файл под наблюдение: void QFileSystemWatcher::addPath ( const QString & path ).
3. Ловим сигнал void QFileSystemWatcher::fileChanged ( const QString & path ) [signal] и отправляем его в слот считывания очередной порции данных.

Это нормальная схема?
Подразумевается что файл обновляется сколь угодно часто, например десятки раз в секунду. Таким образом мне видится следующая проблема:

1. В Файле N строк, которые считываются на первой итерации.
2. В файл добавляется X строк, ватчер испускает сигнал, идем в слот - читаем файл ДО КОНЦА. При этом пока мы читаем, ватчер может испустить еще сколь угодно много сигналов обновления файла и они встанут в очередь выполнения, но мы то уже прочитали файл до конца.


Название: Re: Чтение обновляемого файла
Отправлено: Bepec от Март 07, 2014, 12:03
Ну так напишите свой ватчер. Узнать размер файла вы сможете (я думаю вы можете!), запомнить прошлый размер файла тоже. Что остаётся? таймер и связывание всех действий.


Название: Re: Чтение обновляемого файла
Отправлено: OKTA от Март 07, 2014, 12:13
http://freethreads.wordpress.com/2010/10/20/how-tail-f-work/
Есть замечательная утилитка в linux, называется tail. И замечательный ключик -f.


Название: Re: Чтение обновляемого файла
Отправлено: Johnik от Март 07, 2014, 12:14
вот проверил, вроде как надо работает:

testfileread.h
Код
C++ (Qt)
#include <QtCore>
 
class TestFileRead : public QObject
{
Q_OBJECT
public:
TestFileRead(QObject* parent = NULL);
~TestFileRead();
private slots:
void read();
private:
QFileSystemWatcher w;
QFile* f;
};

testfileread.cpp
Код
C++ (Qt)
#include "testfileread.h"
#include <QDebug>
TestFileRead::TestFileRead(QObject* parent /* = NULL */) : QObject(parent)
{
f = new QFile("1.txt", this);
f->open(QFile::ReadOnly);
w.addPath("1.txt");
connect(&w, &QFileSystemWatcher::fileChanged, this, &TestFileRead::read);
}
TestFileRead::~TestFileRead(){}
void TestFileRead::read()
{
qDebug() << f->readAll();
}



Название: Re: Чтение обновляемого файла
Отправлено: NKovalev64 от Март 08, 2014, 14:34
Всем спасибо за ответы! Пока буду использовать QFileSystemWatcher - пока что он показал себя очень хорошо, буду тестировать под нагрузками.