Makale Özeti

Bu yazımızda Silverlight 2.0 Beta 1 ile beraber gelen istemci taraflı veri saklama sistemi olan Isolated Storage'ı inceleyiyoruz.

Makale

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ı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

        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.