Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> monitoring file system events рекурсивно, помогите сделать 
:(
    Опции темы
xrays777
Дата 27.7.2009, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



Всем привет.
Я начинающий, обращаюсь к вам за помощью.
источники:
- http://en.wikipedia.org/wiki/Inotify
- http://inotify.aiken.cz/?section=inotify&a...out&lang=en (там можно скачать исходные коды на вкладке DOWNLOAD, только в файл inotify-cxx.cppнужно подключить #include <stdio.h>)

есть пример как их использовать:

Код


#include <exception>
#include <iostream>

#include "inotify-cxx.h"

using namespace std;

int main(void)
{
    string watch_dir = "/tmp";

    try {
        Inotify notify;

        InotifyWatch watch(watch_dir, IN_ALL_EVENTS);
        notify.Add(watch);

        cout << "Watching directory " << watch_dir << endl << endl;
        for (;;) {
            notify.WaitForEvents();

            size_t count = notify.GetEventCount();
            while (count > 0) {
                InotifyEvent event;
                bool got_event = notify.GetEvent(&event);

                if (got_event) {
                    string mask_str;
                    event.DumpTypes(mask_str);

                    string filename = event.GetName();

                    cout << "[watch " << watch_dir << "] ";
                    cout << "event mask: \"" << mask_str << "\", ";
                    cout << "filename: \"" << filename << "\"" << endl;
                }

                count--;
            }
        }
    } catch (InotifyException &e) {
        cerr << "Inotify exception occured: " << e.GetMessage() << endl;
    } catch (exception &e) {
        cerr << "STL exception occured: " << e.what() << endl;
    } catch (...) {
        cerr << "unknown exception occured" << endl;
    }

    return 0;
}



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

прошу пожалуйста помочь мне

PM MAIL   Вверх
GrayCardinal
Дата 28.7.2009, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



Делаем popen на чтение для
$ find ./ -type d
Получаем список директорий. Добавляем их. Далее отлавливаем создание файла, проверяем на директорию, если дира - добавляем. Всё.




--------------------
PM MAIL WWW   Вверх
xrays777
Дата 28.7.2009, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



спасибо, но так как я начинающий, то не совсем понимаю как это реализовать? 
подскажиет плиз
PM MAIL   Вверх
GrayCardinal
Дата 28.7.2009, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



xrays777, 
Погодь маленько. Сейчас похаваю , сваяю...


--------------------
PM MAIL WWW   Вверх
xrays777
Дата 28.7.2009, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



спасибо, буду ждать

Это сообщение отредактировал(а) xrays777 - 28.7.2009, 12:25
PM MAIL   Вверх
GrayCardinal
Дата 28.7.2009, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



Цитата

#include <vector>

std::vector<char *> * find_all_dirs (const char * dir)
{
    FILE * f;
    char m_buf[512];
    int i;
    char * S;
    std::vector<char *> * vec;

    vec = new std::vector<char *>;
    sprintf (m_buf, "find %s -type d", dir);
    f = popen (m_buf, "r");
    while (fgets (m_buf, 511, f)) {
    S = strchr (m_buf, '\n');
    if (S) 
     *S = '\0';
    vec->push_back (strdup (m_buf));  
   // printf ("%s\n", m_buf);
    } 
    pclose (f);
    return vec;
}


По первому пункту - ищем диры. На коленке. 


Это сообщение отредактировал(а) GrayCardinal - 28.7.2009, 13:00


--------------------
PM MAIL WWW   Вверх
xrays777
Дата 28.7.2009, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



ясно, а потом для каждой папки создаем объект прослушки
PM MAIL   Вверх
GrayCardinal
Дата 28.7.2009, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



Код

void watch_all (Inotify & notify, std::vector<char *> * dirs)
{
        InotifyWatch * watch;
        int i;
    
        for (i = 0; i < dirs->size (); ++i) {
            watch = new InotifyWatch((*dirs)[i], IN_ALL_EVENTS);
            notify.Add (*watch);
        }    
}


По второму пункту...

Добавлено через 1 минуту и 1 секунду
Цитата

ясно, а потом для каждой папки создаем объект прослушки 

Да. По последнему пункту вопросы есть ?


--------------------
PM MAIL WWW   Вверх
xrays777
Дата 28.7.2009, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 24.7.2009

Репутация: нет
Всего: нет



GrayCardinal, спасибо преогромное, сейчас разбираюсь, пробую в работе, попозже отпишусь
PM MAIL   Вверх
GrayCardinal
Дата 28.7.2009, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



xrays777, 
Завсегда пожалуйста.  smile 


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0469 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.