Makale Özeti

Bu makalemde sizlere FileSystemWatcher isimli component'tan bahsedeceğim. Bu component adından da anlaşılacağı gibi File System üzerinde gerçekleşebilecek çeşitli olayları izleyebilme özelliğine sahiptir. Bu izleme tipi genellikle dosyaların bir uygulama tarafından takip edilmesi veya File System üzerindeki değişikliklerin takip edilmesi amacıyla kullanılır. Bu uygulamaların ne tip uygulamalar olduğunu örneklememiz gerekir ise; File System üzerindeki değişikliklerin takip edilmesi için basit bir ftp tarzı uygulama, dosyaların takip edilmesi için ise belirli bir klasöre dosya kopyalandıktan(ftp ile olabilir) sonra devreye girip bu dosyanın içeriğini batch bir şekilde işleyip uygulamamıza import eden bir listener akla ilk gelen örnekler arasındadır. Çok kısaca ve basitçe özetleyecek olursak bir klasör içindeki dosyalar, klasörler ve alt klasörlerde meydana gelen oluşturulma, isim değiştirme, silinme gibi değişiklikleri FileSystemWatcher class'ı yardımıyla kolaylıkla takip edebiliriz.

Makale

    Merhaba,

    Bu makalemde sizlere FileSystemWatcher isimli component'tan bahsedeceğim. Bu component adından da anlaşılacağı gibi File System üzerinde gerçekleşebilecek çeşitli olayları izleyebilme özelliğine sahiptir. Bu izleme tipi genellikle dosyaların bir uygulama tarafından takip edilmesi veya File System üzerindeki değişikliklerin takip edilmesi amacıyla kullanılır. Bu uygulamaların ne tip uygulamalar olduğunu örneklememiz gerekir ise; File System üzerindeki değişikliklerin takip edilmesi için basit bir ftp tarzı uygulama, dosyaların takip edilmesi için ise belirli bir klasöre dosya kopyalandıktan(ftp ile olabilir) sonra devreye girip bu dosyanın içeriğini batch bir şekilde işleyip uygulamamıza import eden bir listener akla ilk gelen örnekler arasındadır. Çok kısaca ve basitçe özetleyecek olursak bir klasör içindeki dosyalar, klasörler ve alt klasörlerde meydana gelen oluşturulma, isim değiştirme, silinme gibi değişiklikleri FileSystemWatcher class'ı yardımıyla kolaylıkla takip edebiliriz. Peki bu takip işlemini yaparken faydalanacağımız event'lat metodlar veya propertyler nelerdir? Öncelikle bunları inceleyelim.

    FileSystemWatcher class'ı aşağıdaki öğelerden meydana gelmiştir:



    FileSystemWatcher class'ının belli başlı property, event ve metodlarının açıklamaları aşağıda listelenmiştir:

Property'ler

EnableRaisingEvents (bool)

Uygulamamızda kullandığımız FileSystemWatcher nesnesinin aktif olup olmadığının set edildiği property'dir. Eğer true olarak set edilmişse component'in eventleri tetiklenecektir, false ise event'ler tetiklenmeyeceğinden dosyalardaki değişiklikler izlenmeyecektir.

Filter (string)

Hangi dosyalardaki değişikliklerin izleneceğinin set edildiği property'dir. Belirli bir dosyayı izlemek için Filter property'sine dosyanın adı verilebilir. Belirli türde bir dosyayı izlemek için örneğin text file'ları izlemek için Filter property'si "*.txt" olarak set edilebilir. Belirlenen klasördeki tüm dosyalar izlenmek istenirse de bu property "*.*" olarak set edilebilir.

IncludeSubdirectories (bool)

Bir klasördeki alt dizinlerin de FileSystemWatcher ile izlenmesi isteniyorsa IncludeSubdirectories property'si true olarak set edilir.

NotifyFilter (NotifyFilters)

İzlenecek değişikliklerin tanımlandığı propertydir.

Path (string)

İzlenecek olan dizinin veya dosyanın yolunun tutulduğu property'dir.

Method'lar

WaitForChanged

WaitForChangedResult nesnesini döndüren iki overload'ı olan bir metoddur. WaitForChangedResult nesnesi izlenen dosya ile ilgili oluşmuş olan değişikliklere ait bilgilerin tutulduğu bir nesnedir. WaitForChanged metodunun da ilk overload'ı WatcherChangeTypes enum'unda tutulan dosyada hangi tür değişikliğin olacağı verilerek çağırılır. İkinci overload'ı ise hangi tür değişikliğin olacağının yanısıra timeout'a düşmeden önce ne kadar bekleneceğinin süresi milisaniye tipinden verilerek çağırılır.

Event'ler

Changed

Path property'sinde belirtilmiş olan yerdeki dizinde veya dosyada bir değişiklik meydana geldiğinde tetiklenir. Bu eventta Changed, Created ve Deleted eventlarıda yakalanabilir.

Created

Path property'sinde belirtilmiş olan yerde yeni bir dizin veya dosya oluşturulduğunda tetiklenir.

Deleted

Path property'sinde belirtilmiş olan yerde yeni bir dizin veya dosya silindiğinde tetiklenir.

Renamed

Path property'sinde belirtilmiş olan yerdeki dizinin veya dosyanın adı değiştiğinde tetiklenir.

    Görüldüğü gibi FileSystemWatcher nesnesi ile dosya ve dizinlerde meydana gelen değişiklikleri yukarıdaki propertyleri set ettiğimiz ölçüde fırlatılabilecek eventlar yardımıyla izleyebiliriz.

    Şimdi belirlemiş olduğumuz bir klasörde meydana gelen değişikliklerin kaydını tutan örnek bir uygulama yazalım. Uygulamamız bir windows service olsun ve OnStart metodunda FileSystemWatcher nesnemizi oluşturup property'lerini tanımlayalım:

protected override void OnStart(string[] args)
{
        FileSystemWatcher
fsw = new FileSystemWatcher();
        fsw.Filter = "*.*";
        fsw.IncludeSubdirectories = true;
        fsw.NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.DirectoryName | NotifyFilters.FileName;
        fsw.Path = @"C:\fswMakale";
        fsw.Created += new FileSystemEventHandler(fsw_Created);
        fsw.Deleted += new FileSystemEventHandler(fsw_Deleted);
        fsw.Renamed += new RenamedEventHandler(fsw_Renamed);

        fsw.EnableRaisingEvents = true;       
}

    Kodda da görüldüğü gibi FileSystemWatcher nesnemizin Filter property'sine tüm dosyaları izlemesi için *.* ifadesini atadık.

    İzlediği dosya yolunda bulunan alt klasörleri de izlemesi için
IncludeSubdirectories property'sini true olarak set ettik.

    Hangi tür değişikliklerin izleneceğinin set edildiği NotifyFilter property'sine ise NotifyFilters enum'unun Attributes, CreationTime, DirectoryName, FileName öğelerini atadık.

    Uygulamamızın dinleyeceği dosyaların ve klasörlerin bulunduğu dosya yolunu da Path property'sinde set ediyoruz.

    Ardından Created, Deleted ve Renamed event'lerini çağırıyoruz ve FileSystemWatcher nesnemizi EnableRaisingEvents property'sini true olarak set ederek aktif hale getiriyoruz.

    Şimdi sırasıyla OnStart metodunda çağırdığımız Created, Deleted ve Renamed event'lerinde neler yapacağımıza bakalım:

void fsw_Created(object sender, FileSystemEventArgs e)
{
        StreamWriter
sw = new StreamWriter(@"C:\fswMakaleLog.txt", true);
        sw.WriteLine("* Dosya / Klasör: " + e.Name + " -> " + DateTime.Now.ToString() + " tarihinde oluşturuldu.");
        sw.Close();
}

    Yeni bir dosya ya da klasör oluşturulduğunda fswMakaleLog.txt dosyasına aşağıdaki gibi bir kayıt yazılacak:

    * Dosya / Klasör: New Text Document.txt -> 12.04.2007 22:42:51 tarihinde oluşturuldu.

void fsw_Deleted(object sender, FileSystemEventArgs e)
{
        StreamWriter
sw = new StreamWriter(@"C:\fswMakaleLog.txt", true);
        sw.WriteLine("* Dosya / Klasör: " + e.Name + " -> " + DateTime.Now.ToString() + " tarihinde silindi.");
        sw.Close();
}

    Bir dosya silindiğinde fswMakaleLog.txt dosyasına aşağıdaki gibi bir kayıt yazılacak:

    * Dosya / Klasör: IO.txt -> 12.04.2007 23:05:17 tarihinde silindi.

void fsw_Renamed(object sender, RenamedEventArgs e)
{
        StreamWriter
sw = new StreamWriter(@"C:\fswMakaleLog.txt",true);
        sw.WriteLine("* Dosya / Klasör: " + e.OldName + " -> "DateTime.Now.ToString() + " tarihinde " + e.Name + " olarak değiştirildi.");
        sw.Close();
}

    Bir dosyanın ismi değiştirildiğinde ise fswMakaleLog.txt dosyasına aşağıdaki gibi bir kayıt yazılacak:

    * Dosya / Klasör: EskiDosyaAdi.txt -> 12.04.2007 23:08:22 tarihinde YeniDosyaAdi.txt olarak değiştirildi.

    Bu yazdığımız kodu bir windows servis projesi içine implement etmemiz halinde artık Windows servisimiz C sürücüsünün altındaki fswMakale klasörünü dinleyecek ve yine C sürücüsünün altındaki fswMakaleLog.txt dosyasında klasörde meydana gelen değişikliklerin kayıtlarını yazacak. Servisi kurup çalıştırdıktan ve belirlediğimiz klasörde dosya oluşturma, silme, yeniden isimlendirme gibi bazı işlemleri yaptıktan sonra aşağıdaki gibi bir log dosyamız olacak:



    Bu makalemde sizlerle beraber FileSystemWatcher component'ini inceleyerek bu bileşen ile yapabileceğimiz işlemleri ve uygulamalarımıza katabileceğimiz ekstra özellikleri incelemiş olduk. Umarım faydalı olmuştur.

    Işıl ORHANEL

Ornek Uygulama