Russian Qt Forum
Ноябрь 24, 2024, 23:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Чтение обновляемого файла  (Прочитано 4805 раз)
NKovalev64
Гость
« : Март 07, 2014, 11:08 »

Есть задача считывать данные из постоянно обновляемого файла, например лог веб-сервера.
Есть ли какие то средства для решения этой задачи непосредственно в Qt?
Если нет, то как это можно сделать используя только средства С++?
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #1 : Март 07, 2014, 11:18 »

В Qt есть класс QFileSystemWatcher
Записан
NKovalev64
Гость
« Ответ #2 : Март 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 строк, ватчер испускает сигнал, идем в слот - читаем файл ДО КОНЦА. При этом пока мы читаем, ватчер может испустить еще сколь угодно много сигналов обновления файла и они встанут в очередь выполнения, но мы то уже прочитали файл до конца.
Записан
Bepec
Гость
« Ответ #3 : Март 07, 2014, 12:03 »

Ну так напишите свой ватчер. Узнать размер файла вы сможете (я думаю вы можете!), запомнить прошлый размер файла тоже. Что остаётся? таймер и связывание всех действий.
Записан
OKTA
Гость
« Ответ #4 : Март 07, 2014, 12:13 »

http://freethreads.wordpress.com/2010/10/20/how-tail-f-work/
Есть замечательная утилитка в linux, называется tail. И замечательный ключик -f.
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #5 : Март 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();
}

Записан
NKovalev64
Гость
« Ответ #6 : Март 08, 2014, 14:34 »

Всем спасибо за ответы! Пока буду использовать QFileSystemWatcher - пока что он показал себя очень хорошо, буду тестировать под нагрузками.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.087 секунд. Запросов: 22.