Silverlight 2.0 içerisinde Isolated Storage kullanımı

0 dakikada yazıldı

5880 defa okundu

Düzenle

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.