Projenizi geliştirirken bazen bir dizini yada dosyayı izlemeniz gereken durumlar olabiliyor işte bu durumlarda C#’da ihtiyacı karşılamak için FileSystemWatcher sınıfını kullanıyoruz oldukça basit ve anlaşılması kolay olan bu sınıf ve üyelerini(Property, Event, Constructor v.b.) nasıl kullanılacağını örnek kodlarla açıklamaya çalışacağım.
FileSystemWatcher ile klasör yada dosyayı izleme
Bu makalemizde .Net Framework 1.1 ile kullanıma sunulmuş yani neredeyse .Net dünyasının yolunun başlangıcından beri yer alan FileSystemWatcher sınıfını detaylıca örneklerle incelemeye çalışacağız.
Şimdi sırasıyla FileSystemWatcher sınıfının constructor’larını göreceğiz ve parametrelerinin neler olduğunu açıklayacağız, kullanacağımız metodlara gözatacağız ve metodların işlevlerini açıklamasıyla göreceğiz ardından sınıfın property’lerine gözatacağız ve hangi property’nin ne gibi işlevi var bunlara değineceğiz sınıf konusunda net olarak fikir sahibi olduktan sonra güzel açıklamalı örnekler ile makaleyi bitireceğiz son olarak bu makalede ve önceki çoğu makalemdeki örneklere github.com/muratoner adresinden ulaşabilirsiniz bu örneğe ait projeyede makalenin en altındaki github linkinden ulaşabilirsiniz.
Öncelikle FileSystemWatcher’ın sırasıyla sahip olduğu constructor’lar, property’ler ve event’lere gözatalım.
Yapıcı Metodlar – Constructors
Constuctor | Açıklama | |
---|---|---|
FileSystemWatcher() | Default constructor ile FileSystemWatcher sınıfından bir örnek alınabilir diğer parametreler sonradan property’lere verilebilir. | |
FileSystemWatcher(String) | Bu constructor ile belirlediğiniz dizini izleyebilirsiniz notify kısıtlaması yapmadığınız sürece create, delete, change, rename event’leri her dosya için tetiklenecektir. | |
FileSystemWatcher(String, String) | Bir üstteki constructor’a ek olarak ikinci parametreye hangi dosyaları izleyeceğinizi belirtiyorsunuz örnek *.txt ifadesi ile .txt uzantılı tüm dosyalar için üstte belirtilen olayların tetiklenmesini sağlayabilirsiniz. |
Özellikler – Properties
Özellik | Açıklama | |
---|---|---|
EnableRaisingEvents | İzleme yolunu ayarlayıp diğer konfigurasyonlarınızı yaptıktan sonra bu özelliğe true değerini vererek izleme işlemini başlatabilirsiniz. | |
Filter | Bir dizindeki hangi tür dosyaların izleneceğini filtreleyebileceğiniz özelliktir. | |
IncludeSubdirectories | İzlemeye alt kategorilerin dahil edilip edilmeyeceğini boolean değer ile belirtebileceğiniz özelliktir. | |
NotifyFilter | İzleme yapacağınız türleri belirliyorsunuz örnek dosyalar üzerinde izleme sağla, klasörler üzerinden izleme sağla, oluşturma tarihleri üzerinden izleme sağla v.b flag’ler mevcut. Varsayılan olarak şu üç flag atanmıştır NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.LastWrite | |
Path | İzleme yapacağınız dizinin yolunu belirtiyorsunuz. |
Olaylar – Events
Olay | Açıklama | |
---|---|---|
Changed | Belirtttiğiniz yoldaki dizin yada dosya değiştiğinde çalışacak olaydır. | |
Created | Belirtttiğiniz yoldaki dizin yada dosya oluştuğunda çalışacak olaydır. | |
Deleted | Belirtttiğiniz yoldaki dizin yada dosya silindiğinde çalışacak olaydır. | |
Disposed | Dispose yöntemine yapılan çağrı sonucunda component yok edildiğinde tetiklenir. (Component sınıfından miras alır.) | |
Error | FileSystemWatcher örneği değişiklikleri izlemeye devam edemediğinde veya dahili arabellek taşması durumunda oluşur. | |
Renamed | Belirtttiğiniz yoldaki dizin yada dosya yeniden adlandırıldığında çalışacak olaydır. |
Bütün constructor, event ve property’lere gözattıktan sonra şimdide biraz işleyiş kısmına geçelim FileSystemWatcher sınıfı ile belirli bir klasör altındaki tüm değişiklikleri izleyebilirsiniz ayrıca belirlediğiniz dizin altındaki tüm dosya ve alt klasörlerdeki değişiklikleri izleyebilirsiniz fakat burada dikkat edilmesi gereken bir durum var belirlediğiniz dizin altındaki alt dizinlerde oluşturduğunuz dosyalar ve yeni klasörler için tüm değişikliklerde ilgili dosya için event tetiklenmiyor alt klasörlerde dosya/klasör oluşturma, silme ve düzenlemede sadece alt klasör için değişiklik oldu event’i tetiklenecek.
Eğer belirlediğiniz dizin içerisindeki tüm dosyaları izlemek isterseniz constructor’un filter parametresine yada FileSystemWatcher adlı Filter özelliğine *.* ifadesini tanımlamalısınız. Eğer sadece belirli türdeki dosyaları izlemek isterseniz o zaman örnek olarak *.txt şeklinde bir tanımla sadece .txt uzantılı dosyaları izleyebilirsiniz ama sadece belirli bir dosyada izleme yapmak istiyorsanız DosyaAdi.txt şekilde bir ifade kullanabilirsiniz.
Eğer default constructor yada 1 parametreli constructor’i kullanacaksanız bu constructor’lar filter için default olarak *.* pattern’ini atamaktadır.
Şimdi buraya kadar anlattıklarımızı basit bir örnek üzerinden gidelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | using static System.Console; namespace MHG.FileSystemWatcher { class Program { static void Main( string[] args ) { //FileSystemWatcher adlı sınıftan bir örnek alıyoruz ve izleyeceğimiz yoluda constructor'da yolu giriyoruz. var file = new System.IO.FileSystemWatcher( @"C:\Test" ); //Constructor'da verdiğimiz yolu istersek bu şekilde Path özelliğine atayabiliyoruz. //file.Path = @"C:\Test"; //Alt kategorileri izlemeye dahil et. file.IncludeSubdirectories = true; //Dosya için Created, Deleted, Renamed event'leri için sadece bu event'i kullanabilirsiniz. //Ama eğer işin içerisine klasör oluşturma, silme veya yeniden adlandırmayı takip etmek girerse //o zaman Changed event'i haricinde diğer Created, Deleted, Renamed event'lerini kulllanmanız gerekiyor. file.Changed += ( sender, eventArgs ) => { //Bir dosya oluştuğunda değiştiğide yada silindiğinde //eventArgs.ChangeType özelliğinde ilgili enum değerine ulaşabileceksiniz. WriteLine( $"Değiştirilen Nesne Adı: {eventArgs.Name}, Değişiklik Türü: {eventArgs.ChangeType}" ); }; //Yeni bir klasör yada dosya oluştuğunda tetiklenecek event. file.Created += ( sender, eventArgs ) => { WriteLine( $"Oluşturulan Nesne Adı: {eventArgs.Name}" ); }; //Dosya yada klasör silindiğinde tetiklenecek event. file.Deleted += ( sender, eventArgs ) => { WriteLine( $"Silinen Nesne Adı: {eventArgs.Name}" ); }; //Bir hata durumunda tetiklenecek event. file.Error += ( sender, eventArgs ) => { WriteLine( $"Hata: {eventArgs.GetException()}" ); }; //Dosya yada klasör yeniden adlandırmada tetiklenecek event'dir. file.Renamed += ( sender, eventArgs ) => { WriteLine( $"Yeniden Adlandırılan Nesnenin Eski Adı: {eventArgs.OldName}, Yeni Adı: {eventArgs.Name}" ); }; //İzleme işlemini başlatıyoruz. file.EnableRaisingEvents = true; ReadLine(); } } } |
Üstteki kodu açıklarsak FileSystemWatcher sınıfından bir instance aldık 1 parametreli constructor’ina izleyeceğimiz yolu belirterek ve ardından Changed, Created, Deleted, Error, Renamed event’lerine delegate tanımladık son olarak belirttiğimiz yolun izlenmesi ve dosya oluşturma, silme, değiştirme ayrıca klasör oluşturma silme, alt klasörlerdeki işlemlerde yapılacak değişikliklerin tetiklenebilmesi için EnableRaisingEvents adlı özelliğe true değerini atıyoruz.
Üstteki örneğe ait çıktıya alttaki gif’den gözatabilirsiniz.
FileSystemWatcher ile dikkat etmeniz gereken bir durum var oda gizli dosyaların gözardı edilemiyor oluşudur yani gizli dosyalar üzerinde yapılacak işlemlerde yine ilgili event’ler tetiklenecektir.