Silverlight / Silverlight 2.0 ve Isolated Storage Kullanımı
Web uygulamalarında Cookie kullanımı alışık olduğumuz bir yapıdır. Bu yapının bir benzeri Silverlight 2.0 Beta 1 ile beraber de karşımıza geliyor. "Isolated Storage" olarak adlandırılan alan sadece Silverlight uygulamanıza özel olarak varsayılan ayarları ile 100KB'lık bir alanı istemci tarafında programcının kullanımına sunuyor. İlk olarak gelin bu alana veri yazma ve okuma işlemlerinin nasıl yapıldığına bir göz atalım.
Örneğimizde uygulamamız içerisinde bir TextBox ve iki Button yer alacak. Buttonlardan birine basıldığında TextBox içerisindeki veri Isolated Storage içerisine kaydedilecek diğeri ise veriyi silecek. Isolated Storage içerisinde doğrudan dosyalar ve klasörler saklayabiliyoruz. O nedenle biz de örneğimizde saklamak istediğimiz metni bir TXT dosyası şeklinde diske kaydedeceğiz. Gelin ilk olarak uygulamamızın arayüzünü aşağıdaki şekilde hazırlayalım.
<TextBox Margin="38,18,51,105" Text="TextBox" x:Name="txtMetin"/>
<Button Height="41" HorizontalAlignment="Right" Margin="0,0,51,35" VerticalAlignment="Bottom" Width="127" Content="KAYDET" x:Name="DgmKaydet"/>
<Button Height="41" HorizontalAlignment="Left" Margin="104,0,0,35" VerticalAlignment="Bottom" Width="91" Content="KAYDI SİL" x:Name="DgmSil"/>
Uygulamamız ilk açıldığında Isolated Storage içerisinde daha önce kaydedilmiş "deneme.txt" adında bir dosyanın olup olmadığını kontrol edeceğiz. Eğer böyle bir dosya varsa içeriğini okuyarak doğrudan TextBox içerisinde göstereceğiz.
Using DEPO As IO.IsolatedStorage.IsolatedStorageFile = IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication()
If DEPO.FileExists("deneme.txt") Then
Dim Dosya As IO.IsolatedStorage.IsolatedStorageFileStream = DEPO.OpenFile("deneme.txt", IO.FileMode.Open, IO.FileAccess.Read)
Dim Okuyucu As IO.StreamReader = New IO.StreamReader(Dosya)
txtMetin.Text = Okuyucu.ReadToEnd
txtMetin.Text = "Dosya yok"
Isolated Storage ile ilgili yapacağımız tüm işlemleri IsolatedStorageFile.GetUserStoreForApplication() ile mevcut kullanıcının alanını ele alarak yapacağız. O an için istemci işlem yapan kullanıcının bizim uygulamamız için ayrılmış olan alanına ulaştıktan sonra hemen hedef konumda deneme.txt adında bir dosya olup olmadığını FileExists metodu ile kontrol edebiliyoruz. Eğer söz konusu dosya varsa OpenFile metodu ile dosyamızı açarak bir StreamReader'a kaynak olarak veriyoruz. Bundan sonrası aslında alışık olduğumuz dosya okumat metodları. Eğer böyle bir dosya yok ise TextBox içerisinde doğrudan "Dosya Yok" yazdırıyoruz. Eğer dosyamız herhangi bir klasör içerisinde olsaydı gerekli metodlara sadece dosya ismini değil klasör ismi ile beraber bir yol adresini vermek durumunda kalacaktık. Unutmayın tüm bu klasörler ve dosyalar bizim uygulamamıza ait Isolated Storage alanına saklanıyor olacak. Klasör yaratma konusunda özellikle bir uyarıda bulunmam gerek. Normal şartlarda Windows'ta herhangi bir klasör boş ise diskte yer kaplamaz. Isolated Storage içerisinde her klasör 1KB alan kaplıyor. Bunun aslında mantıklı bir açıklaması var; kötü niyetli Silverlight programcıların istemci tarafında milyonlarca klasör yaratmasını engellemek :)
Şimdi geçelim bir sonraki adıma ve elimizdeki metin kutusuna yazılan herhangi bir değeri TXT dosyası olarak Isolated Storage içerisine nasıl kaydedeceğimizi inceleyelim.
Using Dosya As IO.IsolatedStorage.IsolatedStorageFileStream = DEPO.CreateFile("deneme.txt")
Dim Yazici As IO.StreamWriter = New IO.StreamWriter(Dosya)
Yukarıdaki kod içerisinde yine GetUserStoreForApplication diyerek mevcut kullanıcının Isolated Storage alanını alıyoruz ve sonrasında CreateFile metodu ile yeni bir dosya yaratıyoruz. Yarattığımız dosyanın içerisine ise bir StreamWriter ile elimizdeki metni yazdırıyoruz. Kodun en sonunda Istatistik denen bir kodu çalıştırdığımı göreceksiniz. Söz konusu kodu ileriki adımlarda yazacağız. Amacımız Isolated Storage içerisinde kullanılan ve kalan alanı kullanıcıya göstermek olacak.
Artık dosyamızı da kaydettiğimize göre sıra geldi ikinci düğmeye basıldığında söz konusu dosyayı Isolated Storage alanından silmeye.
If DEPO.FileExists("deneme.txt") Then DEPO.DeleteFile("deneme.txt")
Kodumuz gerçekten çok basit. Yine mevcut Isolated Storage alanından yola çekerek FileExists ile dosyanın varlığını kontrol ettikten sonra DeleteFile ile söz konusu dosyayı istemciden siliyoruz. Uygulamamızın tam kodunu incelemeden önce bir de Istatistik adındaki kodumuzu yazalım.
DgmKaydet.Content = "Kaydet " & vbCrLf & "(Kalan Alan:" & Math.Round(DEPO.AvailableFreeSpace / 1024) & "/" & Math.Round(DEPO.Quota / 1024) & ")"
Kullanıcının Isolated Storage alanını bir değişkene aktardıktan sonra doğrudan Quota ile mevcut kotayı, AvailableFreeSpace ile de boş alanınn byte olarak alabiliyoruz. Örneğimizde bu sayıları 1024'e bölerek kullanıcıya KB biriminde bir istatistik gösteriyoruz. Şimdi uygulamamızın son halini inceleyebiliriz.
Private Sub Dugme_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles DgmKaydet.Click
Private Sub DgmSil_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles DgmSil.Click
Örneğimizdeki gibi farklı dosyalar yaratarak Isolatetd Storage alanı içerisinde saklayabilirsiniz. Ayrıca isterseniz CreateDirectory, DeleteDirectory metodlarını kullanarak istemci tarafında farklı klasörler yaratabilir, gerektiğinde GetDirectoryNames ve GetFileNames ile daha önce kaydedilmiş dosya ve klasörlerin isimlerini de birer liste olarak alabilirsiniz.
Peki ya 100KB bize yetmezse?
Eğer 100KB size yetmiyorsa hedef istemcideki kullanıcının iznini alarak söz konusu alanı arttırabilirsiniz. Bunun için aşağıdaki gibi bir kod yeterli olacaktır.
TryIncreaseQuotaTo metoduna parametre olarak istediğiniz alanın byte miktarını aktarmanız gerekiyor. Böylece kullanıcıya uygulamanın daha fazla alan istediğine dair bir uyarı gösterilecek onayı isteniyor. Eğer kullanıdı onay verirse TryIncreaseQuotaTo metodu geriye True döndürüyor, aksi halde ise False Boolean değeri geliyor.
Daha kolay kullanımlı birşey yok mu?
Isolated Storage gerçekten bize istemci tarafında mini bir sabit disk verirmişcesine olanaklar sağlıyor. Oysa bazı durumlarda sadece ufacık bir değeri, uygulamayla ilgili bir ayarı istemci tarafında saklamak gerekebilir. Bunun için tek tek gidip dosyalar yaratmak ve verileri dosyalara kaydetmek uğraştırıcı gelebilir. İşte böyle bir durumda özel olarak hazırlanmış olan System.IO.IsolatedStorage.ApplicationSettings sınıfından faydalanabiliyoruz.
'Mevcut AppSettings nesnesini alalım.
Dim Ayarlar As System.IO.IsolatedStorage.ApplicationSettings = System.IO.IsolatedStorage.ApplicationSettings.Default
'Yeni bir ayar ekleyelim
'Var olan ayarı değiştirelim
Ayarlar("RenkSecimi") = txtMetin.Text
'Var olan bir ayarın değerini alalım
txtMetin.Text = CType(Ayarlar("RenkSecimi"), String)
'Var olan bir ayarı silelim
System.IO.IsolatedStorage.ApplicationSettings sınıfı üzerinden varsayılan ayarları bir değişkene aktardıktan sonra yukarıdaki örnek kod içerisindeki metodları kullanarak rahatlıkla farklı ayarları Isolated Storage içerisine kaydedebiliyor, değiştirebiliyor ve silebiliyoruz.