Watch (gb.inotify)

Questa classe rappresenta un oggetto file system di monitoraggio.

Gli eventi di Inotify vengono segnalati in modo asincrono e il kernel non fornisce alcuna garanzia di aver consegnato gli eventi in modo tempestivo. Se ad esempio un file viene creato e quindi immediatamente eliminato in una directory che si sta monitorando, può accadere che si ottenga l'evento Create dopo che il file è già stato eliminato. Se non stai attento e provi a leggere il file indicato da Watch.Name, il tuo programma andrà in crash con "Nessun file o directory".

Dovresti leggere la sezione "Limitazioni e avvertenze" della manpage di inotify (man 7 inotify). La stessa manpage è una buona fonte per altre informazioni.

Monitorare una directory NON è ricorsivo, cioè riceverai solo eventi dalla directory stessa e dalle sue voci immediate. Se vuoi approfondire, devi aggiungere manualmente watch ricorsivi.

Questa classe è creabile.

Costanti
All   Monitora tutti gli eventi.
Close   Monitora l'evento Close.
Create   Monitora l'evento Create.
Delete   Monitora l'evento Delete.
Move   Monitora l'evento Move.
MoveFrom   Monitora l'evento MoveFrom.
MoveTo   Monitora l'evento MoveTo.
Open   Monitora l'evento Open.
Read   Monitora l'evento Read.
Stat   Monitora l'evento Stat.
Write   Monitora l'evento Write.

Proprietà statiche
Cookie   Un cookie utilizzato per associare eventi. Questo è attualmente utilizzato solo per connettere eventi MoveFrom e MoveTo dello stesso file.
IsDir   Indica se l'oggetto dell'evento è/era una directory.
Name   Il nome del file o della directory soggetto all'evento, relativo all'oggetto Watch che ha attivato l'evento. Se Null, la directory stessa è il soggetto.
Unmount   Restituisce se il filesystem su cui risiedeva il percorso controllato è smontato. In questo caso, l'oggetto Watch viene invalidato subito dopo l'evento.

Proprietà
Events   Restituisce una classe virtuale che specifica la maschera di bit per monitorare gli eventi.
IsPaused   Restituisce se il monitoraggio è in pausa.
Path   Restituisce il percorso osservato.
Tag   Questa variante è a disposizione del programmatore Gambas.

Metodi
Pause   Mette in pausa il monitoraggio, ovvero disabilita la generazione di eventi.
Resume   Riprende il monitoraggio se messo in pausa.

Eventi
Close   Questo evento viene sollevato quando il file monitorato o un file nella directory monitorata viene chiuso.
Create   Questo evento viene sollevato quando viene creato un file o una directory nella directory monitorata.
Delete   Questo evento viene sollevato quando una voce è stata eliminata dalla directory monitorata oppure se è stato eliminato il percorso stesso.
Move   Questo evento viene sollevato quando viene spostato il file o la directory monitorata.
MoveFrom   Questo evento viene sollevato dalla directory di origine quando viene spostato un file.
MoveTo   Questo evento viene generato dalla directory di destinazione quando viene spostato un file.
Open   Questo evento viene sollevato quando viene aperto il file monitorato o una voce della directory monitorata.
Read   Questo evento viene sollevato quando si accede al file monitorato o a una voce nella directory monitorata, ovvero lettura, esecuzione, ...
Stat   Questo evento viene sollevato quando cambiano gli attributi di file/metadati. Da $ man 7 inotify:
Write   Questo evento viene sollevato quando il file monitorato o la voce nella directory monitorata è stata modificata, ovvero scritta, troncata, ....

Le proprietà statiche vengono utilizzate per archiviare i dati dal kernel durante la gestione degli eventi. Usali solo nei gestori di eventi.

Esempio

Use "gb.inotify"
' La riga di sopra serve solo allo script Gambas, nell'IDE Gambas completo, vedi i Componenti del progetto.

Private $hWatch As Watch

Public Sub Main()
  Dim sFile1 As String = Temp$(), sFile2 As String = Temp$()

  $hWatch = New Watch(File.Dir(Temp$()), True) As "Watcher"

  ' Questa riga è ridondante: un oggetto Watch sovrascriverà automaticamente gli eventi per i quali esiste un gestore eventi!
  ' $hWatch.Events[Watch.Create Or Watch.Delete] = True
  Print "I'm watching... "

  ' Crea due file
  File.Save(sFile1, "abc")
  File.Save(sFile2, "def")
  Wait 0.1 ' enter event loop to see events

  ' Elimina un file
  Kill sFile2
  Wait 0.1

  ' Elimina il secondo file. L'evento Delete è stato annullato a questo punto (vedi Watcher_Delete), quindi per questo motivo non viene generato alcun evento.
  Kill sFile1
  Wait 1

  Quit
End

Public Sub Watcher_Create()
  Print "Create: " & Watch.Name
End

Public Sub Watcher_Delete()
  Print "Delete: " & Watch.Name
  ' Non sovrascrive le cancellazioni dopo la prima.
  Last.Events[Watch.Delete] = False
End
I'm watching...
Create: 1.tmp
Create: 2.tmp
Delete: 2.tmp