Makale Özeti

FileSystemWatcher ile lokal bilgisayarın dosya sisteminde bulunan değişiklikleri, bir ağ sürücüsündeki meydana gelebilecek değişiklikleri ve hatta uzaktaki bir bilgisayarın dosya sistemindeki değişiklikler (uzaktaki bilgisayarın Windows NT veya 2000 tabanlı olmak şartıyla) denetlenebilir. FileSystemWatcher birkaç özelliğe sahiptir. Bu özelliklerle hangi tipteki ve klasördeki dosyaların denetleneceği belirlenir.

Makale

The FileSystemWatcher Component

 

FileSystemWatcher bir arayüze sahip olmayan, ve uygulamımızın dosya sistemindeki değişiklikleri izlemesini sağlayan özel bir componenttir. 

 

FileSystemWatcher ile lokal bilgisayarın dosya sisteminde bulunan değişiklikleri, bir ağ sürücüsündeki meydana gelebilecek değişiklikleri ve hatta uzaktaki bir bilgisayarın dosya sistemindeki değişiklikler (uzaktaki bilgisayarın Windows NT veya 2000 tabanlı olmak şartıyla) denetlenebilir. FileSystemWatcher birkaç özelliğe sahiptir. Bu özelliklerle hangi tipteki ve klasördeki dosyaların denetleneceği belirlenir.

 

Denetleyebilinen parçalar, klasörler ve dosyalardır. İstedinilen klasörde istenilen tipteki dosya denetlenebilir. Denetlemeden kasıt FileSystemWatcher’ ın olaylarıdır. Bu olaylar; dosya veya dizini yaratma(Created), silme(Deleted), değiştirme(Changed) ve ismini değiştirmedir(Renamed). Ayrıca özel bir olay daha vardır: hata(Error) olayı. Bu olay çok fazla değişiklik olduğu zaman ve FileSystemWatcher değişikliklerin hepsini yakalayamadığı zaman çalışır.

 

Özellikler

FileSystemWatcher component’ ı “Toolbox” ın “Components” kısmında yer almaktadır. Bu component projeye eklendiği zaman “Properties” penceresinde aşağıdaki özellikler bulunacaktır;

 

 

NotifyFilter:

Bu özellik ile denetlenmek istenen değişikliklerin tipleri (FileName, DirectoryName, Attributes, Size, LastWrite, LastAccess, CreationTime, Security) belirtilir. Bu tipler IO.NotifyFilters enumeration(liste)’ ın üyesidir. Yukarıdaki şekilde görüldüğü gibi isimlerini veya değerlerini virgül ile ayırıp yazarak birden fazla tip üzerinde denetleme yapılabilir. Kod tarafında çoklu seçim yapmak için ise Or operatörü kullanılır.

 

FileSystemWatcher1.NotifyFilter = IO.NotifyFilters.CreationTime Or _

                                 IO.NotifyFilters.LastWrite

 

Üye Adı

Açıklaması

Değeri

Attributes

Dosya veya klasörün özellikleri.

4

CreationTime

Dosya veya klasörün yaratıldığı zaman.

64

DirectoryName

Dizinin adı.

2

FileName

Dosyanın adı.

1

LastAccess

Dosya veya klasörün son açılma tarihi.

32

LastWrite

Dosya veya klasöre en son birşeylerin yazıldığı tarihi.

16

Security

Dosya veya klasördeki güvenlik ayarları.

256

Size

Dosya veya klasörün boyutu.

8

 

Path:

Bu özelliği kullanarak istenilirse denetlemek istenilen özel bir dizin seçilebilir. Böylece FileSystemWatcher sadece bu özel dizinde denetleme yapacaktır. Eğer bu özel dizinin alt dizinlerinin de denetlemeye dahil olması istenilirse IncludeSubdirectories özelliğinin değeri True yapılmalıdır.

 

Filter:

Bu özellik denetlenecek dosyaları filtrelemek için kullanılır. Eğer *.doc yazılırsa sadece word dökümanlarının denetlenmesi sağlanır. Tüm dosyaları denetlemek için bu özellik *.* değerine ayarlanmalıdır.

 

EnableRaisingEvents:

File System içindeki değişiklikleri denetlemeye başlamak içini bu özelliğin True değerine ayarlanması gerekmektedir. Bu özellik True olduğu sürece FileSystemWatcher her değişiklikte ilgili olayı tetikler.

 

Olaylar

FileSyatemWatcher her değişiklikte ilgili olayı tetikler ve bu olayın çalışmasını sağlar. Bu olaylar; Changed, Created, Deleted, ve Renamed olaylarıdır. Tüm olaylarda 2 argüman vardır: sender ve e argümanı.

e.ChangeType: e argümanı ChangeType üyesi vasıtasıyla değişiğin tipi hakkındaki bilgiyi taşır. e.ChangeType üyeleri IO.WatcherChangeTypes enumeration üyeridir: All, Changed,Created, Deleted, ve Renamed.

e.FullPathve e.Name özellikleri; değiştirilen,yaratılan veya silinen dosyanın yolu ve dosya adıdır.

Son olarak; Renamed olayı e argümanı için iki özellik daha sunar; OldFullPath ve OldName. Bu üyeler yeniden adlandırılmış dosyanın eski yolunun ve isminin geri alınmasına olanak sağlar.

Changed, Created, and Deleted olayları için genel bir olay yakalayıcı (event handler) yazınabilinir. Çünkü bunlar aynı argümanları kullanılıyorlar. Fakat Rename olayı için aynı şey söylenemez. Çünkü e argümanı burada farklı bir tiptedir.

FileSystemWatcher tarafından kontrol edilen tüm değişiklikler bir internal buffer içinde saklanır. Eğer kısa zaman içinde çok fazla değişiklik olursa bufferda bir taşma söz konusu olabilir. Bufferdaki olası taşmadan korunmak için, Filter ve Path özelliklerini ayarlayarak denetlenen dosya sayılarına belli bir limit konulmalıdır.

Eğer bufferda bir taşma olursa Error olayı meydana gelir. Bu olay yakalayıcısı içinde InternalBufferSize özelliğini ayarlayarak bufferın boyutu arttırılabilinir. Örneğin bu olay içine

 

FileSystemWatcher1.InternalBufferSize= 2* FileSystemWatcher1.InternalBufferSize

 

kodunu yazarak var olan buffer 2 katına çıkartırılır.

 

Örnek Program

Aşağıda şekli görülen örnekte, textbox(txtDirName) içine yazılacak dizindeki değişikliklerin,  Appearance’ ı buton yapılmış checkbox(chkStart) check edildiği andan itibaren listboxtan(lstFiles) satır satır izlenmesi sağlanacaktır. Bu örnekte FileSystemWatcher GUI kullanılmadan kod tarafında oluşturuldu.

 

 

    Private WithEvents fsWatchObj As FileSystemWatcher

 

    Private Sub FileChanged(ByVal s As System.Object, ByVal EventInfo As _

    FileSystemEventArgs)

        Dim DisplayMessage As String

        DisplayMessage = "File " & EventInfo.Name & " was "

        DisplayMessage &= EventInfo.ChangeType.ToString & " at " & _

                         DateTime.Now.ToString

        lstFiles.Items.Add(DisplayMessage)

    End Sub

 

    Private Sub FileRenamed(ByVal s As System.Object, ByVal EventInfo As _

    RenamedEventArgs)

        Dim DisplayMessage As String

        DisplayMessage = "File " & EventInfo.OldName

        DisplayMessage &= " was renamed to " & EventInfo.Name & " at " & _

                         DateTime.Now.ToString

        lstFiles.Items.Add(DisplayMessage)

    End Sub

 

    Private Sub chkStart_CheckedChanged(ByVal sender As System.Object, _

    ByVal e As System.EventArgs) Handles chkStart.CheckedChanged

        If chkStart.Checked Then

            chkStart.Text = "Stop Watcher"

            SetupWatcher(txtDirName.Text)

            MessageBox.Show("File watching started for " & txtDirName.Text)

        Else

            chkStart.Text = "Start Watcher"

            lstFiles.Items.Clear()

            fsWatchObj.Dispose()

        End If

     End Sub

 

    Private Sub SetupWatcher(ByVal PathToWatch As String)

        fsWatchObj = New FileSystemWatcher

        fsWatchObj.Path = PathToWatch

        fsWatchObj.IncludeSubdirectories = False

        fsWatchObj.EnableRaisingEvents = True

 

        AddHandler fsWatchObj.Created, AddressOf FileChanged

        AddHandler fsWatchObj.Changed, AddressOf FileChanged

        AddHandler fsWatchObj.Deleted, AddressOf FileChanged

        AddHandler fsWatchObj.Renamed, AddressOf FileRenamed

    End Sub

 

 

Bu örnekte Created, Changed ve Deleted olayları için ayrı ayrı fonksiyon yazılmadı. Bunun yerine SetupWatcher adlı fonksiyon içerisinde AddHandler events AddressOf eventhandler durumu kullanılarak bu 3 olay yakalayıcının da aynı fonksiyonu kullanması sağlandı. Yukarıda da anlatıldığı gibi Renamed olayı bunlara dahil edilemiyor.

 

chkStart adlı checkboxa basıp önce bir klasör daha sonra da bir text dosyası üzerinde işlem yaptıktan sonraki ekran çıktısı aşağıdaki gibidir.

 

 

Bu yazıda dosya sistemlerinde kullanılan FileSystemWatcher componenti incelendi  ve örnek bir program yapıldı. MSDN içerisinde linkteki adreste bulunan  site içerisinde bulunan örnekler içerisinde konuyla ilgili güzel bir örnek var.

 

Başka yazılarla görüşmek üzere...