Как я могу контролировать каталоги в Вала? - PullRequest
0 голосов
/ 15 июля 2011

Как я могу асинхронно контролировать некоторые каталоги в vala?Все, что мне нужно, это вызвать метод обратного вызова, когда файл в одном из каталогов:

  • создан
  • удален
  • изменен

Я нашел GLib.FileMonitor , но я не уверен, как его использовать.

Ответы [ 3 ]

2 голосов
/ 16 июля 2011

Чтобы отслеживать каталог, вам сначала нужно создать GLib.File из этого каталога, используя один из статических методов GLib.File.new_ *. new_for_path , вероятно, то, что вы хотите.

Затем вам нужно создать GLib.FileMonitor для этого каталога, используя метод monitor_directory объекта GLib.File.

Затем можно подключиться к измененному сигналу объекта GLib.FIleMonitor.

Когда вы компилируете, вам нужно будет включить --pkg gio-2.0.

Пример:

void on_change () {
    print("changed\n");
}

void main () {
    GLib.File usr_share_applications = File.new_for_path(
        "/usr/share/applications"
    );
    GLib.File local_share_applications = File.new_for_commandline_arg(
        GLib.Environment.get_user_data_dir() + "/applications"
    );

    GLib.FileMonitor mon1;
    GLib.FileMonitor mon2;

    try {
        mon1 = usr_share_applications.monitor_directory(
            GLib.FileMonitorFlags.NONE
        );
        mon1.changed.connect(on_change);
        print("Monitoring: "+usr_share_applications.get_path()+"\n");
    } catch (GLib.Error e) {
        print("Error: "+e.message+"\n");
    }
    try {
        mon2 = local_share_applications.monitor_directory(
            GLib.FileMonitorFlags.NONE
        );
        mon2.changed.connect(on_change);
        print("Monitoring: "+local_share_applications.get_path()+"\n");
    } catch (GLib.Error e) {
        print("Error: "+e.message+"\n");
    }

    GLib.MainLoop loop = new GLib.MainLoop();
    loop.run();
}
2 голосов
/ 16 июля 2011

Всегда откат к исходной документации: http://developer.gnome.org/gio/unstable/GFileMonitor.html

Вы создаете монитор из файла GLib.File, затем подключаетесь к измененному сигналу .

0 голосов
/ 07 июня 2012

Вот пример C, использующий только inotify. Несмотря на то, что он автономен, его можно изменить для работы в режиме ожидания (вместо while (1)) и вызова обратного вызова (вместо printf)

/* inotify us of the file changes in directory */
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/inotify.h>

#define EVENT_SIZE  ( sizeof (struct inotify_event) )
#define EVENT_BUF_LEN     ( 1024 * ( EVENT_SIZE + 16 ) )

int main(int argc, char** argv){
int length, i, watch, fd = inotify_init();
char buffer[EVENT_BUF_LEN];

if ( fd < 0 ) perror( "inotify init failed" );

watch = inotify_add_watch( fd, argv[1], /* should check if argv[1] is a dir */
  IN_CREATE | IN_DELETE | IN_MODIFY | IN_MOVED_FROM | IN_MOVED_TO | IN_ATTRIB );

while (1){
i=0;
length = read( fd, buffer, EVENT_BUF_LEN ); 
if ( length < 0 ) perror( "reading inotify fd" );
  while ( i < length ) {
    struct inotify_event *event = ( struct inotify_event * ) &buffer[ i ];
    if ( event->len ) {
      if (event->mask & IN_ATTRIB)printf("%s sttributes changed\n",event->name);
      if (event->mask & IN_CREATE)printf("%s created\n",event->name);
      if (event->mask & IN_DELETE)printf("%s deleted\n",event->name);
      if (event->mask & IN_MODIFY)printf("%s modified\n",event->name);
      if (event->mask & IN_MOVED_FROM)printf("%s moved out\n",event->name);
      if (event->mask & IN_MOVED_TO)printf("%s moved in\n",event->name);
    }
    i += EVENT_SIZE + event->len;
  }
}
inotify_rm_watch( fd, watch );
close( fd );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...