Monitor di directory con Gio

Autore: Fabio Di Matteo
Ultima revisione: 27/12/2015 - 19:54

Di seguito vedremo come monitorare una directory con gio in C .

main.c

#include <gio/gio.h>
 
 
// All'evento "changed" deve essere associata una funzione con i seguenti
// argomenti.
void myCallback(GFileMonitor     *monitor,
               GFile            *file,
               GFile            *other_file,
               GFileMonitorEvent event_type,
               gpointer          user_data) 
{
	char* myFile=g_file_get_path (file);
 
	/*
	 * Elenco dei flag degli eventi dei monitor
	 * https://developer.gnome.org/gio/stable/GFileMonitor.html#GFileMonitorEvent
	*/
	if (event_type==G_FILE_MONITOR_EVENT_CREATED) g_print("File %s creato. \n", myFile);
	if (event_type==G_FILE_MONITOR_EVENT_DELETED) g_print("File %s cancellato. \n", myFile);
	if (event_type==G_FILE_MONITOR_EVENT_CHANGED) g_print("File %s e' cambiato. \n", myFile);
 
}
 
 
 
int main(int argc, char** argv )
{
 
	//Ciclo principale glib
	GMainLoop *loop;
    loop = g_main_loop_new ( NULL , FALSE );
 
	//Conterra' eventuali info sugli errori
	GError *error=NULL;
 
	//Directory da monitorare
	GFile *mydir= g_file_new_for_path ("/home/fabio/tmp/");
 
	//Aggancio il monitor alla directory
	GFileMonitor *myMonitor=g_file_monitor_directory (mydir,
														G_FILE_MONITOR_NONE,
														NULL,
															&error);
 
	//Gestisco eventuali errori di lettura
	if (error!=NULL)
	{
		 g_error("Attenzione errore : %s\n",error->message);
	}														
 
	//Al segnale "changed" del mio monitor(myMonitor) eseguo myCallback
	g_signal_connect (myMonitor, "changed", G_CALLBACK(myCallback), NULL);
 
	//Eseguo il ciclo principale delle Glib
	g_main_loop_run (loop);
    g_main_loop_unref(loop);
 
 
 
 
	return 0;
}

makefile

CPP = gcc
OPTS = `pkg-config --cflags --libs gio-2.0`

all:
	$(CPP)  main.c -o main $(OPTS)

clean:
	rm main