| Editor Login | Register | ||
| > Bilgisayar > Nesne Programlama > vb.net |
|
|
| 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, SecurityHer 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
Ş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.FileSystemEventArgsargü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 Renamede.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.RenamedEventArgsBu argüman yukarıda anlattığımız e argümanına ek olarak iki özellik daha sunar; OldFullPath ve OldNameBu ü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
Ş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ğlantılar: bilgininefendisi.net |
| Open Source Document Project | AUP&TOS |