Silverlight - izolowana pamięć masowa

Trzecim mechanizmem dostępu do plików jest Isolated Storagemechanizm zapewniający pamięć skojarzoną z zalogowanym użytkownikiem. API prezentuje dane za pomocąStream klasa od .NET System.IOprzestrzeń nazw. Dlatego, podobnie jak w przypadku innych mechanizmów, które omówiliśmy do tej pory, możesz użyć innych typów wSystem.IO do pracy ze strumieniami, umożliwiając przechowywanie danych tekstowych lub binarnych.

Niektóre ważne funkcje to -

  • Ten mechanizm przechowywania nazywa się Isolated Storage ponieważ sklep jest podzielony na partycje, a aplikacja Silverlight ma dostęp tylko do niektórych części.

  • Nie możesz uzyskać dostępu do żadnych starych przechowywanych danych. Przede wszystkim magazyn jest podzielony na użytkowników. Aplikacja Silverlight nie może uzyskać dostępu do sklepu dla innego użytkownika niż zalogowany i uruchamiający aplikację.

  • Nie ma to nic wspólnego z mechanizmami identyfikacji, których może używać Twoja aplikacja internetowa. Jest to ważna kwestia, o której należy pamiętać, ponieważ niektórzy ludzie, którzy współdzielą komputery, nie zawracają sobie głowy oddzielnymi kontami Windows i są przyzwyczajeni do logowania się i wylogowywania z witryn internetowych, z których korzystają.

Korzystanie z izolowanej pamięci masowej

Izolowana pamięć masowa nie jest unikalna dla Silverlight. Interfejs API został pierwotnie wprowadzony dlaWindows Formsaby umożliwić aplikacjom uruchamianym z sieci Web przechowywanie danych lokalnie w scenariuszach częściowego zaufania. Implementacja jest inna i nie ma możliwości uzyskania pełnego dostępu.NET Izolowana pamięć masowa platformy Framework z Silverlight lub odwrotnie.

Jeśli jednak go użyłeś, kroki tutaj będą wyglądać bardzo znajomo.

  • Zaczynasz od zapytania o sklep dla konkretnego użytkownika. W tym przypadku prosimy o podanie tego do wniosku. Gdybyśmy chcieli, aby sklep dla każdej witryny był współdzielony przez wszystkie XAP w witrynie, zadzwonilibyśmyGetUserStoreForSite zamiast.

  • Każda metoda zwraca plik IsolatedStorageFile obiekt, co jest dość nieprzydatną nazwą, ponieważ reprezentuje katalog, a nie plik.

  • Aby uzyskać dostęp do pliku, musisz zapytać IsolatedStorageFile dla Stream.

  • Używamy IsolatedStorageFileStream klasa, a jej konstruktor wymaga przekazania klasy IsolatedStorageFile obiekt jako argument.

  • Więc tworzymy nowy plik w sklepie. Dokładna lokalizacja pliku na dysku jest nieznana.

  • Katalog zawierający losowe elementy ma na celu uniemożliwienie odgadnięcia nazwy pliku.

  • Bez tego złośliwe witryny mogłyby umieścić plik na komputerze użytkownika, a następnie utworzyć adres URL pliku, aby go otworzyć, w nadziei na oszukanie użytkownika w celu kliknięcia odsyłacza uruchamiającego program lokalnie.

  • Istnieje wiele innych zabezpieczeń wbudowanych w system Windows, które próbują temu zapobiec, ale jest to kolejna warstwa ochrony na wypadek, gdyby inne zostały w jakiś sposób wyłączone lub ominięte.

  • Plik zostanie zapisany gdzieś w profilu użytkownika, ale to tyle, ile możesz o nim wiedzieć. TwójIsolatedStorageFileStream nie zgłosi swojej prawdziwej lokalizacji.

Spójrzmy na prosty przykład, który śledzi, ile razy aplikacja została uruchomiona. Poniżej podano kod XAML.

<UserControl x:Class = "StoreRunCount.MainPage" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
   xmlns:d = "http://schemas.microsoft.com/expression/blend/2008" 
   xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" 
   mc:Ignorable = "d" 
   d:DesignHeight = "300" d:DesignWidth = "400"> 
   
   <Grid x:Name = "LayoutRoot" Background = "White"> 
      <TextBlock x:Name = "runCountText" FontSize = "20" /> 
   </Grid> 
	
</UserControl>

Oto kod C #, w którym Isolated storage są używane.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 

using System.IO.IsolatedStorage; 
using System.IO;

namespace StoreRunCount { 

   public partial class MainPage : UserControl {
	
      const string RunCountFileName = "RunCount.bin"; 
		
      public MainPage() { 
         InitializeComponent();  
         int runCount = 0;  
			
         using (var store = IsolatedStorageFile.GetUserStoreForApplication()) { 
			
            if (store.FileExists(RunCountFileName)) { 
               using (var stm = store.OpenFile(RunCountFileName, 
                  FileMode.Open, FileAccess.Read)) 
               using (var r = new BinaryReader(stm)) { 
                  runCount = r.ReadInt32(); 
               }  
            } 
			
            runCount += 1;  
            using (var stm = store.OpenFile(RunCountFileName, 
               FileMode.Create, FileAccess.Write)) 
					
            using (var w = new BinaryWriter(stm)) { 
               w.Write(runCount); 
            } 
         }  
			
         runCountText.Text = "You have run this application " + runCount.ToString() + " time(s)"; 
      } 
   }
}

Kiedy powyższy kod zostanie skompilowany i wykonany, zobaczysz następującą stronę internetową, która pokaże Ci, ile razy uruchomisz tę aplikację.

Zwiększenie limitu

Wnioski mogą wymagać więcej miejsca, jeśli początkowa kwota jest z jakiegoś powodu niewystarczająca. Nie ma gwarancji, że żądanie się powiedzie. Silverlight zapyta użytkownika, czy chętnie przyzna aplikacji więcej miejsca.

Nawiasem mówiąc, możesz poprosić o więcej miejsca tylko w odpowiedzi na dane wejściowe użytkownika, takie jak plik click. Jeśli spróbujesz zapytać go innym razem, na przykład podczas ładowania wtyczki lub w programie obsługi licznika czasu, Silverlight automatycznie zawiedzie żądanie, nawet bez monitowania użytkownika. Dodatkowy przydział jest dostępny tylko dla aplikacji, z którymi użytkownik korzysta.

Plik IsolatedStorageFile obiekt zapewnia trzech członków do zarządzania kwotami -

  • AvailableFreeSpace
  • IncreaseQuotaTo
  • Quota

DostępneFreeSpace

Właściwość AvailableFreeSpace informuje, jaka część przydziału pozostaje wolna.

Należy zauważyć, że nawet pusty podkatalog zużywa część przydziału, ponieważ system operacyjny musi przydzielić miejsce na dysku, aby reprezentować katalog. Zatem dostępne miejsce może być mniejsze niż całkowity przydział pomniejszony o sumaryczny rozmiar wszystkich plików.

IncreaseQuotaTo

Jeśli nie masz wystarczająco dużo miejsca, aby kontynuować, możesz poprosić o więcej, dzwoniąc do IncreaseQuotaTo metoda.

Kontyngent

Tutaj używamy trzeciej właściwości, Quota, aby odkryć aktualny rozmiar limitu, a następnie dodajemy dodatkową kwotę, której potrzebujemy, aby uzyskać nowy wymagany limit.

Metoda zwraca albo True lub Falsewskazać, czy przydzielono nam to, o co prosiliśmy. Zauważ, że Silverlight może zdecydować o przydzieleniu większej ilości miejsca niż prosiłeś.

Oto prosty przykład, aby zwiększyć quota, po kliknięciu przycisku. Poniżej podano kod XAML.

<UserControl x:Class = "ChangeQuota.MainPage" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
   xmlns:d = "http://schemas.microsoft.com/expression/blend/2008" 
   xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" 
   mc:Ignorable = "d" 
   d:DesignHeight = "300" d:DesignWidth = "400"> 
   
   <Grid x:Name = "LayoutRoot" Background = "White"> 
      <TextBlock x:Name = "infoText" FontSize = "20" TextWrapping = "Wrap" />  
      <Button x:Name = "increaseQuota" Content = "Increase" HorizontalAlignment = "Center" 
         FontSize = "20" 
         VerticalAlignment = "Center" Click = "increaseQuota_Click" /> 
   </Grid>
	
</UserControl>

Oto implementacja click zdarzenie, w którym kwota jest zwiększona.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input;
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 

using System.IO.IsolatedStorage;
  
namespace ChangeQuota { 

   public partial class MainPage : UserControl { 
	
      public MainPage() { 
         InitializeComponent(); 
      } 
	  
      private void increaseQuota_Click(object sender, RoutedEventArgs e) { 
         using (IsolatedStorageFile isoStore = 
            IsolatedStorageFile.GetUserStoreForApplication()) { 
               long newQuota = isoStore.Quota + 10240; 
					
               if (isoStore.IncreaseQuotaTo(newQuota)) { 
                  infoText.Text = "Quota is " + isoStore.Quota + ", free space: " + 
                  isoStore.AvailableFreeSpace; 
               } else { 
                  infoText.Text = "Meanie!"; 
               } 
         } 
      } 
   } 
}

Gdy powyższy kod zostanie skompilowany i wykonany, zobaczysz następujące dane wyjściowe.

Po kliknięciu Increase, pojawi się monit. Prosi o zwiększenieQuota być o 10 KB większe niż to, czym już jest.

Po kliknięciu Yes, następnie wypisuje dostępną kwotę.

Zalecamy wykonanie powyższych przykładów w celu lepszego zrozumienia.