La classe FileSystemWatcher
Vi siete mai accorti che, quando due folder browser visualizzano il contenuto di
una stessa cartella e voi fate una modifica in uno dei due, quella modifica
viene riflettuta anche nell'altro browser? E vi siete mai chiesti come cio'
avvenga? Il sistema e' in grado di controllare i cambiamenti nelle cartelle e
notificare, con un evento, un'applicazione che ne abbia fatto richiesta. Allo
stesso modo, l'oggetto FileSystemWatcher incaspula la tecnologia in
grado di monitorare i cambiamenti all'interno di una cartella e comunicarli
all'applicazione che lo ospita.
Il FileSystemWatcher controlla i cambiamenti in una specifica directory. Puo'
essere istruito a monitorare cambiamenti su file o sottodirectory. Esso
controlla file sul computer locale, un drive di rete o un computer remoto.
La proprieta' Filter specifica il tipo di file da tenere sotto
controllo. Ad esempio, impostando il suo valore a "*.txt", controlliamo tutti i
file di testo. Con "" controlliamo tutti i file e con "documento.txt", solo il
file specificato.
La proprieta' NotifyFilter ci permette di indicare per quali tipi di
cambiamento vogliamo essere notificati. L'enumerazione NotifyFilters specifica
i valori che tale proprieta' puo' assumere:
-
Attributes
- cambio di attributi
-
CreationTime- cambio della data di creazione
-
DirectoryName
- cambio del nome di una directory
-
FileName
- cambio del nome di un file
-
LastAccess
- cambio della data di ultimo accesso
-
LastWrite
- cambio della data di ultima scrittura
-
Security
- cambio sui permessi
-
Size
- cambio della dimensione del file o directory
Esistono quattro fipi diversi di eventi che possono verificarsi: Created,
Changed, Deleted e Renamed. Spetta a noi decidere quali
fra questi eventi ascoltare ed associarli ad una o piu' routine che li
gestiscano. Per far questo ci serviamo dell'istruzione AddHandler.
Esempio:
Il seguente esempio si propone di impiegare un FileSystemWatcher per spiare
l'attivita' della cartella "Desktop". Un pulsante alternativamente abilita e
disabilita la ricezione degli eventi del filesystem ed una TextBox li
visualizza. Siamo interessati alla creazione, cancellazione, modifica e
rinominazione di file e directory. Create un progetto che contenga un Form
(Form1), una TextBox (TextBox1, Multiline = True) ed un Button (btnWatch).
Inserite il codice presentato nel Form.
Importiamo i simboli relativi alla classe FileSystemWatcher.
Imports System.IO.FileSystemWatcher
Dichiariamo l'oggetto FileSystemWatcher.
Dim watcher As System.IO.FileSystemWatcher
1) Cliccando il tasto, si abilita e si disabilita la ricezione degli eventi. La
proprieta' che utilizziamo e' EnableRaisingEvents. Quando il suo valore
e' True, gli eventi sono abilitati. Coerentemente con l'abilitazione e la
disabilitazione, cambiamo anche l'etichetta al pulsante per indicare quale
sara' l'effetto della sua pressione (Watch/Stop).
Private Sub btnWatch_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnWatch.Click
If btnWatch.Text = "Watch" Then
watcher.EnableRaisingEvents = True
btnWatch.Text = "Stop"
Else
watcher.EnableRaisingEvents = False
btnWatch.Text = "Watch"
End If
End Sub
2) Al caricamento del Form avviene la maggior parte dell'impostazioni del Watcher.
Innanzitutto lo creiamo e disabilitamo gli eventi. La proprieta' Path ci
permette di specificare quale directory monitorare. Impostiamo la notifica
per file e directory. Vogliamo controllare esclusivamente i file
di testo (*.txt). Infine associamo a ciascuno dei quattro eventi una procedura
diversa, che implementeremo di seguito.
Private Sub Form1_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
TextBox1.Text = ""
btnWatch.Text = "Watch"
watcher = New System.IO.FileSystemWatcher()
watcher.EnableRaisingEvents = False
watcher.Path = "C:\Documents and Settings\User\Desktop\"
watcher.NotifyFilter = IO.NotifyFilters.LastAccess Or _
IO.NotifyFilters.LastWrite Or _
IO.NotifyFilters.DirectoryName Or _
IO.NotifyFilters.FileName
watcher.Filter = "*.txt"
AddHandler watcher.Created, AddressOf OnCreated
AddHandler watcher.Changed, AddressOf OnChanged
AddHandler watcher.Deleted, AddressOf OnDeleted
AddHandler watcher.Renamed, AddressOf OnRenamed
End Sub
3) Queste sono le implementazioni dei quattro gestori di eventi. Ci limitiamo ad
inserire nella TextBox una riga che contiene il tipo di evento accaduto e chi
l'ha generato. Notate che il prototipo della procedura OnRenamed ha parametri
diversi dalle altre. Il parametro "e" di tipo FileSystemEventArgs e quello
di tipo RenamedEventArgs ci forniscono dati sull'evento.
Private Sub OnCreated(ByVal sender As Object, _
ByVal e As System.IO.FileSystemEventArgs)
TextBox1.Text &= ("Created: """ & e.Name & """" & vbCrLf)
End Sub
Private Sub OnChanged(ByVal sender As Object, _
ByVal e As System.IO.FileSystemEventArgs)
TextBox1.Text &= ("Changed: """ & e.Name & """" & vbCrLf)
End Sub
Private Sub OnDeleted(ByVal sender As Object, _
ByVal e As System.IO.FileSystemEventArgs)
TextBox1.Text &= ("Deleted: """ & e.Name & """" & vbCrLf)
End Sub
Private Sub OnRenamed(ByVal sender As Object, _
ByVal e As System.IO.RenamedEventArgs)
TextBox1.Text &= ("Renamed: """ & e.OldName & """ to """ & _
e.Name & """" & vbCrLf)
End Sub
Prima che il Form venga chiuso disabilitiamo gli eventi.
Private Sub Form1_Closing(ByVal sender As Object,
ByVal e As System.ComponentModel.CancelEventArgs) _
Handles MyBase.Closing
watcher.EnableRaisingEvents = False
End Sub
Per i dettagli sull'oggetto FileSystemWatch consultare la documentazione in
Visual Studio .Net
Ultimo aggiornamento 13/01/2004
|