Russian Qt Forum

Программирование => Общий => Тема начата: QuAzI от Декабрь 10, 2010, 01:42



Название: Отслеживать изменений в файлах
Отправлено: QuAzI от Декабрь 10, 2010, 01:42
Есть задача отлеживать изменения в файлах по всему винту (файлы можно фильтровать по маске, но не суть важно, в общем их много), далее их содержимое индексируется в базу. Есть у Qt какая-нибудь приблуда, чтобы отловить изменение/закрытие файла, чтобы не сканировать впустую через каждые несколько минут всю ФС?
Или как это реализовать средствами ОС и для win и для *nix (На работе win, дома FreeBSD).


Название: Re: Отслеживать изменений в файлах
Отправлено: Пантер от Декабрь 10, 2010, 08:22
QFileSystemWatcher?


Название: Re: Отслеживать изменений в файлах
Отправлено: QuAzI от Декабрь 10, 2010, 11:01
Вроде оно, только не вкурил, как с ним работать?
Периодически самому надо опрашивать список изменившихся файлов или можно скормить ему указатель на функцию, которую он будет запускать? Или вообще делать на его основе свой класс, в котором энто обрабатывать?


Название: Re: Отслеживать изменений в файлах
Отправлено: Пантер от Декабрь 10, 2010, 11:23
Добавляешь
void QFileSystemWatcher::addPath ( const QString & path )
И ловишь сигнал
void QFileSystemWatcher::directoryChanged ( const QString & path ) [signal]


Название: Re: Отслеживать изменений в файлах
Отправлено: QuAzI от Декабрь 10, 2010, 12:09
В сервисе в конструкторе пытаюсь всё это инициализировать
Код:
    watcher = new QFileSystemWatcher();
    watcher->addPath(path);
    QObject::connect(watcher, SIGNAL(fileChanged(const QString &))), MyService, SLOT(scanfile(const QString &));
Не выходит каменный цветок, на connect матерится
Цитировать
no matching function for call to 'QObject::connect(QFileSystemWatcher*&, const char*)'
В начале объявления класса сервиса Q_OBJECT прописано, QFileSystemWatcher() тоже QObject, если я правильно понял из документации. Чего ему надо?


Название: Re: Отслеживать изменений в файлах
Отправлено: Пантер от Декабрь 10, 2010, 12:19
QObject::connect(watcher, SIGNAL(fileChanged(QString)), MyService, SLOT(scanfile(QString)));


Название: Re: Отслеживать изменений в файлах
Отправлено: QuAzI от Декабрь 10, 2010, 12:46
Тепереча аккурат на этой строке expected primary-expression before ',' token


Название: Re: Отслеживать изменений в файлах
Отправлено: Пантер от Декабрь 10, 2010, 12:47
MyService - это что? Побольше кода приведи.


Название: Re: Отслеживать изменений в файлах
Отправлено: QuAzI от Декабрь 10, 2010, 12:58
В аттаче весь main.cpp .

p.s. не по теме вопрос, в pro-файле можно прописать какой-нить алиас для include?
А то приходится для дома и для работы две строки гонять, по сути обе указывают на QtService/qtservice.pri в include.
Код:
include(/usr/local/include/qt4/QtService/qtservice.pri)
include(D:/Qt/2010.05/qt/include/QtService/qtservice.pri)
Видел упоминание про $$INCLUDE, но include($$INCLUDE/QtService/qtservice.pri) не прокатило.


Название: Re: Отслеживать изменений в файлах
Отправлено: Пантер от Декабрь 10, 2010, 13:23
QObject::connect(&watcher, SIGNAL(fileChanged(QString)), this, SLOT(scanfile(QString)));

И я не помню, прокатит ли такое объявление класса в main.cpp. Вынеси в отдельный h/cpp


Название: Re: Отслеживать изменений в файлах
Отправлено: QuAzI от Декабрь 10, 2010, 14:40
Убрал из класса сервиса определение, что он Q_OBJECT, создал отдельный класс на базе QObject для слота, куда его и воткнул. Вроде стало линковаться. Но при помещении в отслеживаемую директорию файла удачно сдохло. Буду ковыряться дальше.


Название: Re: Отслеживать изменений в файлах
Отправлено: Пантер от Декабрь 10, 2010, 14:42
Сигнал приходит? Может дохнет на scanfile?


Название: Re: Отслеживать изменений в файлах
Отправлено: QuAzI от Декабрь 10, 2010, 15:24
Оказалось не дохнет. Это у QService поведение такое хитрое, он его не запущает, а пытается сервис стартануть, а если сервис не проинсталлирован, то спустя несколько секунд он удачно дохнет с алертом что не может запустить сервис. Только я т.к. из под Qt запускал, не успевал алерт глянуть.
Победил, одно смущает - скормил в QFileSystemWatcher директорию. Вижу только добавление, удаление файлов. Редактирование файлов не вижу - надо файлы в список загонять. Ничего наподобии recursive* в его методах не вижу. Придётся ручками всё дерево файлов каждый раз обходить и построчно загонять?


Название: Re: Отслеживать изменений в файлах
Отправлено: QuAzI от Декабрь 10, 2010, 16:24
Watch на директорию при создании объекта (будь то файл или новая директория) возвращает имя родительской директории, а не "нового" объекта. Поэтому или делать всё статично и следить только за обновлениями в файлах, или сканировать всю директорию, сравнивать постоянно список. Кошмар.


Название: Re: Отслеживать изменений в файлах
Отправлено: Amigo_sa от Декабрь 10, 2010, 18:24

p.s. не по теме вопрос, в pro-файле можно прописать какой-нить алиас для include?
А то приходится для дома и для работы две строки гонять, по сути обе указывают на QtService/qtservice.pri в include.
Как вариант можно переменные среды использовать, на каждом компе они разные, указывают в локальные папки, но строка инклуда одинаковая.


Название: Re: Отслеживать изменений в файлах
Отправлено: QuAzI от Декабрь 19, 2010, 03:09
В общем впихнул я QFileSystemWatcher в сервис. Пока сервис работает из консоли (с параметром -e), всё красиво. То же самое запускаю как сервис (без параметра) и отлавливать изменения в файлах перестаёт. Ошибок при коннекте сигналов fileChanged и directoryChanged не выдаёт, список файлов заполнен.