Differenze tra le versioni di "Monitorare con le funzioni esterne del API di libgio-2.0 le modifiche apportate ad un file"
Da Gambas-it.org - Wikipedia.
Riga 1: | Riga 1: | ||
La libreria ''libgio-2.0'' di GLIB consente, fra l'altro, di intercettare le eventuali modifiche apportate ad uno specifico file, ovvero ad un qualsiasi file all'interno di una cartella. | La libreria ''libgio-2.0'' di GLIB consente, fra l'altro, di intercettare le eventuali modifiche apportate ad uno specifico file, ovvero ad un qualsiasi file all'interno di una cartella. | ||
− | E' necessario avere installata nel sistema e richiamare in Gambas la libreria | + | E' necessario avere installata nel sistema e richiamare in Gambas la libreria condivisa: "''libgio-2.0.so.0.6400.6'' " |
− | |||
Mostriamo un esempio pratico, nel quale monitoreremo il contenuto della cartella dei file temporanei ''/tmp'' : | Mostriamo un esempio pratico, nel quale monitoreremo il contenuto della cartella dei file temporanei ''/tmp'' : | ||
− | Library "libgio-2.0:0. | + | Library "libgio-2.0:0.6400.6" |
Private Enum G_FILE_MONITOR_NONE = 0, G_FILE_MONITOR_WATCH_MOUNTS, G_FILE_MONITOR_SEND_MOVED, | Private Enum G_FILE_MONITOR_NONE = 0, G_FILE_MONITOR_WATCH_MOUNTS, G_FILE_MONITOR_SEND_MOVED, | ||
Riga 49: | Riga 48: | ||
<FONT Color=gray>' ''Impostiamo la cartella da monitorare:''</font> | <FONT Color=gray>' ''Impostiamo la cartella da monitorare:''</font> | ||
− | + | s = "/tmp" | |
− | + | gf = g_file_new_for_path(s) | |
− | + | If gf == 0 Then Error.Raise("Impossibile impostare il percorso del file da monitorare !") | |
− | + | mon = g_file_monitor(gf, G_FILE_MONITOR_SEND_MOVED, 0, 0) | |
− | + | If mon == 0 Then Error.Raise("Impossibile monitorare " & s & " !") | |
<FONT Color=gray>' ''Funzione Callback che chiama la 'Funzione di Callback' per intercettare gli eventi sui file della cartella monitorata:''</font> | <FONT Color=gray>' ''Funzione Callback che chiama la 'Funzione di Callback' per intercettare gli eventi sui file della cartella monitorata:''</font> | ||
− | + | g_signal_connect_data(mon, "changed", callback, 0, 0, 0) | |
− | + | gml = g_main_loop_new(0, False) | |
− | + | If gml == 0 Then Error.Raise("Errore !") | |
+ | |||
+ | g_main_loop_run(gml) | ||
− | + | g_main_loop_unref(gml) | |
− | + | g_object_unref(mon) | |
− | + | g_object_unref(gf) | |
'''End''' | '''End''' | ||
− | |||
'''Private''' Function callback(monitor As Pointer, primo As Pointer, secondo As Pointer, evento As Integer, udata As Pointer) | '''Private''' Function callback(monitor As Pointer, primo As Pointer, secondo As Pointer, evento As Integer, udata As Pointer) | ||
Riga 75: | Riga 75: | ||
Dim eventi As String[] | Dim eventi As String[] | ||
− | + | eventi = ["CHANGED", "CHANGES_DONE_HINT", "DELETED", "CREATED", "ATTRIBUTE_CHANGED", | |
− | + | "PRE_UNMOUNT", "UNMOUNTED", "MOVED", "RENAMED", "MOVED_IN", "MOVED_OUT"] | |
<FONT Color=gray>' ''Descrive il tipo di evento ed il file interessato:''</font> | <FONT Color=gray>' ''Descrive il tipo di evento ed il file interessato:''</font> | ||
− | + | ris = "Evento n. " & evento & " = '" & eventi[evento] & "' - " & " Nome primo file: " & | |
− | + | Quote(IIf(primo > 0, g_file_get_basename(primo), "---")) & | |
− | + | ", Nome secondo file: " & Quote(IIf(secondo > 0, g_file_get_basename(secondo), "---")) | |
− | + | Print ris | |
'''End''' | '''End''' | ||
− | |||
Versione delle 18:28, 1 dic 2021
La libreria libgio-2.0 di GLIB consente, fra l'altro, di intercettare le eventuali modifiche apportate ad uno specifico file, ovvero ad un qualsiasi file all'interno di una cartella.
E' necessario avere installata nel sistema e richiamare in Gambas la libreria condivisa: "libgio-2.0.so.0.6400.6 "
Mostriamo un esempio pratico, nel quale monitoreremo il contenuto della cartella dei file temporanei /tmp :
Library "libgio-2.0:0.6400.6" Private Enum G_FILE_MONITOR_NONE = 0, G_FILE_MONITOR_WATCH_MOUNTS, G_FILE_MONITOR_SEND_MOVED, G_FILE_MONITOR_WATCH_HARD_LINKS, G_FILE_MONITOR_WATCH_MOVES ' GFile * g_file_new_for_path (const char *path) ' Constructs a GFile for a given path. Private Extern g_file_new_for_path(path As String) As Pointer ' GFileMonitor * g_file_monitor (GFile *file, GFileMonitorFlags flags, GCancellable *cancellable, GError **error) ' Obtains a file or directory monitor for the given file, depending on the type of the file. Private Extern g_file_monitor(GFile As Pointer, flags As Integer, cancellable As Pointer, GError As Pointer) As Pointer ' gulong g_signal_connect_data (gpointer instance, const gchar *detailed_signal, GCallback c_handler, gpointer data, GClosureNotify destroy_data, GConnectFlags connect_flags) ' Connects a GCallback function to a signal for a particular object. Private Extern g_signal_connect_data(instance As Pointer, detailed_signal As String, c_handler As Pointer, data As Pointer, destroy_data As Pointer, connect_flags As Integer) As Long ' GMainLoop * g_main_loop_new (GMainContext *context, gboolean is_running) ' Creates a new GMainLoop structure. Private Extern g_main_loop_new(context As Pointer, is_running As Boolean) As Pointer ' void g_main_loop_run (GMainLoop *loop) ' Runs a main loop until g_main_loop_quit() is called on the loop. Private Extern g_main_loop_run(gloop As Pointer) ' char * g_file_get_basename (GFile *file) ' Gets the base name (the last component of the path) for a given GFile. Private Extern g_file_get_basename(GFile As Pointer) As String ' void g_main_loop_unref (GMainLoop *loop) ' Decreases the reference count on a GMainLoop object by one. Private Extern g_main_loop_unref(gloop As Pointer) ' void g_object_unref (gpointer object) ' Decreases the reference count of object. Private Extern g_object_unref(Gobject As Pointer) Public Sub Main() Dim s As String Dim gf, mon, gml As Pointer ' Impostiamo la cartella da monitorare: s = "/tmp" gf = g_file_new_for_path(s) If gf == 0 Then Error.Raise("Impossibile impostare il percorso del file da monitorare !") mon = g_file_monitor(gf, G_FILE_MONITOR_SEND_MOVED, 0, 0) If mon == 0 Then Error.Raise("Impossibile monitorare " & s & " !") ' Funzione Callback che chiama la 'Funzione di Callback' per intercettare gli eventi sui file della cartella monitorata: g_signal_connect_data(mon, "changed", callback, 0, 0, 0) gml = g_main_loop_new(0, False) If gml == 0 Then Error.Raise("Errore !") g_main_loop_run(gml) g_main_loop_unref(gml) g_object_unref(mon) g_object_unref(gf) End Private Function callback(monitor As Pointer, primo As Pointer, secondo As Pointer, evento As Integer, udata As Pointer) Dim ris As String Dim eventi As String[] eventi = ["CHANGED", "CHANGES_DONE_HINT", "DELETED", "CREATED", "ATTRIBUTE_CHANGED", "PRE_UNMOUNT", "UNMOUNTED", "MOVED", "RENAMED", "MOVED_IN", "MOVED_OUT"] ' Descrive il tipo di evento ed il file interessato: ris = "Evento n. " & evento & " = '" & eventi[evento] & "' - " & " Nome primo file: " & Quote(IIf(primo > 0, g_file_get_basename(primo), "---")) & ", Nome secondo file: " & Quote(IIf(secondo > 0, g_file_get_basename(secondo), "---")) Print ris End