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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Отслеживать изменений в файлах  (Прочитано 11490 раз)
QuAzI
Гость
« : Декабрь 10, 2010, 01:42 »

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

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Декабрь 10, 2010, 08:22 »

QFileSystemWatcher?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
QuAzI
Гость
« Ответ #2 : Декабрь 10, 2010, 11:01 »

Вроде оно, только не вкурил, как с ним работать?
Периодически самому надо опрашивать список изменившихся файлов или можно скормить ему указатель на функцию, которую он будет запускать? Или вообще делать на его основе свой класс, в котором энто обрабатывать?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Декабрь 10, 2010, 11:23 »

Добавляешь
void QFileSystemWatcher::addPath ( const QString & path )
И ловишь сигнал
void QFileSystemWatcher::directoryChanged ( const QString & path ) [signal]
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
QuAzI
Гость
« Ответ #4 : Декабрь 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, если я правильно понял из документации. Чего ему надо?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Декабрь 10, 2010, 12:19 »

QObject::connect(watcher, SIGNAL(fileChanged(QString)), MyService, SLOT(scanfile(QString)));
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
QuAzI
Гость
« Ответ #6 : Декабрь 10, 2010, 12:46 »

Тепереча аккурат на этой строке expected primary-expression before ',' token
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Декабрь 10, 2010, 12:47 »

MyService - это что? Побольше кода приведи.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
QuAzI
Гость
« Ответ #8 : Декабрь 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) не прокатило.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Декабрь 10, 2010, 13:23 »

QObject::connect(&watcher, SIGNAL(fileChanged(QString)), this, SLOT(scanfile(QString)));

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

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
QuAzI
Гость
« Ответ #10 : Декабрь 10, 2010, 14:40 »

Убрал из класса сервиса определение, что он Q_OBJECT, создал отдельный класс на базе QObject для слота, куда его и воткнул. Вроде стало линковаться. Но при помещении в отслеживаемую директорию файла удачно сдохло. Буду ковыряться дальше.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #11 : Декабрь 10, 2010, 14:42 »

Сигнал приходит? Может дохнет на scanfile?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
QuAzI
Гость
« Ответ #12 : Декабрь 10, 2010, 15:24 »

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

Watch на директорию при создании объекта (будь то файл или новая директория) возвращает имя родительской директории, а не "нового" объекта. Поэтому или делать всё статично и следить только за обновлениями в файлах, или сканировать всю директорию, сравнивать постоянно список. Кошмар.
Записан
Amigo_sa
Гость
« Ответ #14 : Декабрь 10, 2010, 18:24 »


p.s. не по теме вопрос, в pro-файле можно прописать какой-нить алиас для include?
А то приходится для дома и для работы две строки гонять, по сути обе указывают на QtService/qtservice.pri в include.
Как вариант можно переменные среды использовать, на каждом компе они разные, указывают в локальные папки, но строка инклуда одинаковая.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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