adszone.org
venerdì 20 settembre 2024
"Il modo corretto di pensare il software"
home
consulenza  vb.net  contatti 
  Visual Basic .NET
  FileSystemWatcher
Domande

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