Makale Özeti

Bu yazımızda FileSystemWatcher Componentinin yapısını inceleyerek basit bir örnek demo yapacağız.

Makale

FileSystemWatcher

Bu yazımızda FileSystemWatcher Componentinin yapısını inceleyerek basit bir örnek demo yapacağız.

FileSystemWatcher (Dosya Sistemi İzleyicisi); bir arayüzü olmayan ve uygulamamızın dosya sistemindeki değişiklikleri izlemesini sağlayan özel bir componenttir. Bu component .Net Framework içerisindeki System.IO NameSpace(İsim Adı) inin içinde bulunur.

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şiklikleri (uzaktaki bilgisayarın Windows NT veya 2000 tabanlı olmak şartıyla) denetleyebiliriz. FileSystemWatcher birkaç özelliğe sahiptir. Bu özelliklerle hangi tipteki ve klasördeki dosyaların denetleneceği belirlenir.

Denetleyebildiğimiz parçalar; klasörler ve dosyalardır. Bu component yardımıyla istenilen klasördeki istenilen tipteki dosyayı denetleyebiliriz. Bunu yapabilmek için bu nesnenin olaylarına başvururuz. Yani Denetlemeden kasıt FileSystemWatcher’ ın olaylarıdır. Bu olaylar ise şunlardır;

  • Dosya veya dizini yaratma (Created),
  • Silme (Deleted),
  • Değiştirme (Changed) ve
  • İsmini değiştirmedir (Renamed).

Ayrıca özel bir olay daha vardır:

  • Hata (Error) olayı

Bu olay çok fazla değişiklik olduğu ve FileSystemWatcher bu değişikliklerin hepsini yakalayamadığı zaman çalışır.

Önce FileSysytemWatcher componentinin özelliklerini inceleyelim.

Özellikler

FileSystemWatcher component’ ı “Toolbox” ın “Components” kısmında yer almaktadır. Bu component projeye eklendiği zaman bu componentin “Properties” penceresinde Şekil 1 de bulunan özellikler bulunacaktır;

    Şekil 1          FileSystemWatcher Componentinin Özellikleri


NotifyFilter:

Bu özellik ile denetlemek istediğimiz değişikliklerin tiplerini belirtiriz. Bu tipler IO.NotifyFilters Enumeration(liste)’ ın üyesidir. Değiştirebileceğimiz tipler şunlardır;

  • FileName,
  • DirectoryName,
  • Attributes,
  • Size,
  • LastWrite,
  • LastAccess,
  • CreationTime,
  • Security

Her bir tipin bir sayısal değeri vardır. Tablo 1 de bu tiplerin açıklaması ve değerleri verilmiştir. Devamlı kullanılacaksa kod yazımında hız kazandırması açısından değerlerini bilmemizde fayda olabilir.

 

    Tablo 1          IO.NotifyFilters Enumeration Üyeleri

Ü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

Şekil 1 de görüldüğü gibi isimlerini veya değerlerini virgül ile ayırıp yazarak birden fazla tip üzerinde denetleme yapabiliriz.

FileSystemWatcher1.NotifyFilter = IO.NotifyFilters.CreationTime Or IO.NotifyFilters.LastWrite

Yukarıdaki örnek kod satırında gördüğümüz gibi Kod tarafında çoklu seçim yapmak için ise, Or operatörünü kullanırız.

Path:

Bu özelliği kullanarak; istersek, denetlemek için özel bir dizin şeçebiliriz. Böylece FileSystemWatcher sadece bu özel dizinde denetleme yapar. Eğer bu özel dizinin alt dizinlerinin de denetlemeye dahil olmasını istiyorsak IncludeSubdirectories özelliğinin değerini True yapmalıyız.

Filter:

Bu özelliği, denetleyeceğimiz dosyaları filtrelemek için kullanırız. Örneğin; eğer *.doc yazsak sadece word dökümanlarının denetlenmesini sağlayabiliriz. Tüm dosyaları denetlemek için bu özelliği *.* değerine ayarlamamız gerekmektedir.

EnableRaisingEvents:

File System (Dosya Sistemi) içindeki değişiklikleri denetlemeye başlamak için bu özelliğin değerini True yapmamız gerekmektedir. Bu özellik True olduğu sürece FileSystemWatcher her değişiklikte ilgili olayı tetikler.

Şimdi de tetiklenecek bu olaylara bir göz atalım.

Olaylar

FileSystemWatcher her değişiklikte ilgili olayı tetikler ve bu olayın çalışmasını sağlar. Bu olaylar yukarıda da belirtildiği gibi; Changed, Created, Deleted, ve Renamed olaylarıdır. Tüm olaylarda ortak 2 argüman vardır.bu argümanlar;

  • sender As Object
  • e As System.IO.FileSystemEventArgs

argümanlarıdır.

Sender değişken ismiyle belirtilen argüman olayları çağıran nesnelerle ilgili özellikleri verir.

e değişken ismiyle belirtilen argümanın barındırdığı özellikler şunlardır(yazının devamında e argümanı olarak bahsedilecektir);

e.ChangeType: e argümanı ChangeType özelliği vasıtasıyla değişikliğin tipi hakkındaki bilgiyi taşır. e.ChangeType üyeleri IO.WatcherChangeTypes enumeration üyeridir.

Bu üyeler şunlardır;

  • All,
  • Changed,
  • Created,
  • Deleted ve
  • Renamed

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

Son olarak; Renamed olayında e argümanı farklıdır. 

  • e As System.IO.RenamedEventArgs

Bu argüman yukarıda anlattığımız e argümanına ek olarak 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, ve Deleted olayları için genel bir olay yakalayıcı (event handler) yazabiliriz. Çü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 koymalıyız.

Eğer bufferda bir taşma olursa Error olayı meydana gelir.Bu olayın meydana gelmemesi için InternalBufferSize özelliğini ayarlayarak bufferın boyutunu arttırmalıyız. Veya Error olayının içine böyle bir kod yazıp hata olursa bufferın boyutunu arttırabiliriz. Örneğin bu olay içine

FileSystemWatcher1.InternalBufferSize= 2* FileSystemWatcher1.InternalBufferSize

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

Şimdi anlattıklarımızla ilgili ufak bir örnek yaparak teoriyi pratiğe dökelim.

Örnek Program

Şekil 2 de örnek ekran görünümü görülen örnekte, textbox(txtDirName) içine yazılacak dizindeki değişiklikleri listbox(lstFiles) ile satır satır izleyeceğiz. Bu olay; Appearance özelliği buton yapılmış checkbox(chkStart) check edildiği andan itibaren başlayacak. Bu örnekte FileSystemWatcher Componentini GUI kullanmadan kod tarafında oluşturduk.

    Şekil 2            FileSystemWatcher İle İlgili Örneğin Ekran Görünümü


Kod yazımına başlamadan önce, en yukarıya yani Form Classının üstüne;

Imports System.IO

Yazarak bu İsim Adını projemize ekleyelim.Daha sonra Şekil 3 ile gösterilen kod bloklarını programımıza ekleyelim

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

    Şekil 3            FileSystemWatcher İle İlgili Örneğin Kod Yapısı

Bu örnekte Created, Changed ve Deleted olayları için ayrı ayrı fonksiyon yazmadık. Bunun yerine SetupWatcher adlı fonksiyon içerisinde AddHandlerevents AddressOf eventhandler durumunu kullanarak bu 3 olay yakalayıcının da aynı fonksiyonu kullanmasını sağlandık. 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ı Şekil 4 tekine benzer bir yapıda olacaktır.

    Şekil 4            FileSystemWatcher İle İlgili Örneğin Çıktı Görünümü


Şekil 4 çıktısı için önce bir klasör oluşturduk. Sonra bu klasörün isminin değiştirdik. Ve daha sonra da bu klasörü sildik. Aynı şekilde devamında da bir text dosyası oluşturuk. Sonra bu dosyanın ismini değiştirip üzerinde birkaç değişiklik yaptık. Enson olarak bu dosyayı da sildik. Şekil 4 te bu yaptığımız işlemlerin hepsinin logunun tutulmuş olduğunu görüyoruz.

Bu yazımızda dosya sistemlerinde kullanılan FileSystemWatcher componentinin yapısını incelendik; ve örnek bir program yaptık. MSDN içerisinde de linkteki adreste bulunan site içerisindeki örnekler arasında konuyla ilgili örnek incelenebilinir. Güzel bir örnek.

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

kadirerdogan@hotmail.com