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.
<UserControl x:Class="SilverlightApplication12.Page"
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<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"/>
</Grid>
</UserControl>
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
Okuyucu.Close()
Else
txtMetin.Text = "Dosya yok"
End If
End Using
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 DEPO As IO.IsolatedStorage.IsolatedStorageFile = IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication()
Using
Dosya As IO.IsolatedStorage.IsolatedStorageFileStream = DEPO.CreateFile("deneme.txt")
Dim Yazici As IO.StreamWriter = New IO.StreamWriter(Dosya)
Yazici.Write(txtMetin.Text)
Yazici.Close()
Istatistik()
End Using
End Using
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.
Using DEPO As IO.IsolatedStorage.IsolatedStorageFile = IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication()
If DEPO.FileExists("deneme.txt") Then DEPO.DeleteFile("deneme.txt")
End Using
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.
Sub Istatistik()
Using DEPO As IO.IsolatedStorage.IsolatedStorageFile = IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication()
DgmKaydet.Content = "Kaydet " & vbCrLf & "(Kalan Alan:" & Math.Round(DEPO.AvailableFreeSpace / 1024) & "/" & Math.Round(DEPO.Quota / 1024) & ")"
End Using
End Sub
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.
Partial Public Class Page
Inherits UserControl
Public Sub New()
InitializeComponent()
End Sub
Private Sub Page_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
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
Okuyucu.Close()
Else
txtMetin.Text = "Dosya yok"
End If
End Using
End Sub
Private Sub Dugme_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles DgmKaydet.Click
Using DEPO As IO.IsolatedStorage.IsolatedStorageFile = IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication()
Using Dosya As IO.IsolatedStorage.IsolatedStorageFileStream = DEPO.CreateFile("deneme.txt")
Dim Yazici As IO.StreamWriter = New IO.StreamWriter(Dosya)
Yazici.Write(txtMetin.Text)
Yazici.Close()
Istatistik()
End Using
End Using
End Sub
Sub Istatistik()
Using DEPO As IO.IsolatedStorage.IsolatedStorageFile = IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication()
DgmKaydet.Content = "Kaydet " & vbCrLf & "(Kalan Alan:" & Math.Round(DEPO.AvailableFreeSpace / 1024) & "/" & Math.Round(DEPO.Quota / 1024) & ")"
End Using
End Sub
Private Sub DgmSil_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles DgmSil.Click
Using DEPO As IO.IsolatedStorage.IsolatedStorageFile = IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication()
If DEPO.FileExists("deneme.txt") Then DEPO.DeleteFile("deneme.txt")
End Using
Istatistik()
Page_Loaded(sender, e)
End Sub
End Class
Ö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.
Using DEPO As IO.IsolatedStorage.IsolatedStorageFile = IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication()
DEPO.TryIncreaseQuotaTo(1000000)
End Using
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ımı 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
Ayarlar.Add("RenkSecimi", "Kirmizi")
'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
Ayarlar.Remove("RenkSecimi")
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.
Hepinize kolay gelsin.
Daron Yöndem