Название: Отслеживать изменений в файлах Отправлено: 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(); Цитировать 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) Название: 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 не выдаёт, список файлов заполнен.
|