Silverlight - Изолированное хранилище

Третий механизм доступа к файлам - Isolated Storageмеханизм, который обеспечивает хранилище, связанное с вошедшим в систему пользователем. API представляет данные черезStream класс от .NET System.IOпространство имен. Поэтому, как и в случае с другими механизмами, которые мы рассмотрели до сих пор, вы можете использовать другие типы вSystem.IO для работы с потоками, позволяя хранить текстовые или двоичные данные.

Некоторые важные функции -

  • Этот механизм хранения называется Isolated Storage потому что хранилище разделено, и приложение Silverlight имеет доступ только к определенным частям.

  • Вы не можете получить доступ к каким-либо старым сохраненным данным. Прежде всего, хранилище разделено на каждого пользователя. Приложение Silverlight не может получить доступ к хранилищу для другого пользователя, кроме того, который вошел в систему и запустил приложение.

  • Это не имеет ничего общего с какими-либо механизмами идентификации, которые может использовать ваше веб-приложение. Это важный момент, о котором следует помнить, потому что некоторые люди, использующие один компьютер, не беспокоятся об отдельных учетных записях Windows и привыкли просто входить в систему и выходить с веб-сайтов, которые они используют.

Использование изолированного хранилища

Изолированное хранилище не уникально для Silverlight. Первоначально API был представлен дляWindows Formsчтобы позволить приложениям, запускаемым из Интернета, хранить данные локально в сценариях частичного доверия. Реализация другая, и нет возможности получить доступ к полной.NET Изолированное хранилище Framework от Silverlight или наоборот.

Однако, если вы использовали его, шаги здесь будут вам очень знакомы.

  • Вы начинаете с запроса конкретного магазина. В этом случае мы просим один для приложения. Если бы мы хотели, чтобы хранилище для каждого сайта было общим для всех XAP на сайте, мы бы назвалиGetUserStoreForSite вместо.

  • Любой метод возвращает IsolatedStorageFile объект, имя которого бесполезно, поскольку представляет собой каталог, а не файл.

  • Чтобы получить доступ к файлу, вам нужно спросить IsolatedStorageFile для Stream.

  • Мы используем IsolatedStorageFileStream class, а его конструктор требует, чтобы вы передали IsolatedStorageFile объект в качестве аргумента.

  • Итак, мы создаем новый файл в магазине. Точное расположение файла на диске неизвестно.

  • Содержащий каталог имеет случайные элементы, чтобы невозможно было угадать имя файла.

  • Без этого вредоносные веб-сайты могли бы разместить файл на компьютере пользователя, а затем создать URL-адрес файла для его открытия в надежде заставить пользователя щелкнуть ссылку, которая запускает программу локально.

  • В Windows встроены различные другие средства защиты, которые пытаются предотвратить это, но это еще один уровень защиты на случай, если другие каким-то образом были отключены или обойдены.

  • Файл будет храниться где-то внутри профиля пользователя, но это все, что вы можете о нем знать. ТвойIsolatedStorageFileStream не сообщит о своем истинном местонахождении.

Давайте посмотрим на простой пример, который отслеживает, сколько раз приложение было запущено. Ниже приведен код 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>

Вот код C #, в котором Isolated storage используются.

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)"; 
      } 
   }
}

Когда приведенный выше код скомпилирован и выполнен, вы увидите следующую веб-страницу, которая покажет вам, сколько раз вы запускали это приложение.

Увеличение вашей квоты

Приложения могут запросить дополнительное место, если первоначальная сумма по каким-либо причинам недостаточна. Нет никакой гарантии, что запрос будет успешным. Silverlight спросит пользователя, согласны ли они предоставить приложению больше места.

Кстати, вам разрешено запрашивать дополнительное пространство только в ответ на ввод пользователя, например click. Если вы попытаетесь спросить его в другой раз, например, при загрузке подключаемого модуля или в обработчике таймера, Silverlight автоматически отклонит запрос, даже не запрашивая у пользователя. Дополнительная квота доступна только для приложений, с которыми взаимодействует пользователь.

В IsolatedStorageFile объект предоставляет три члена для управления квотой -

  • AvailableFreeSpace
  • IncreaseQuotaTo
  • Quota

ДоступноFreeSpace

Свойство AvailableFreeSpace сообщает вам, какая часть вашей квоты остается свободной.

Обратите внимание, что даже пустой подкаталог потребляет часть вашей квоты, потому что операционной системе необходимо выделить место на диске для представления каталога. Таким образом, доступное пространство может быть меньше общей квоты за вычетом суммарного размера всех ваших файлов.

IncreaseQuotaTo

Если у вас недостаточно места для продолжения, вы можете попросить больше, позвонив в IncreaseQuotaTo метод.

Квота

Здесь мы используем третье свойство, Quota, чтобы узнать текущий размер квоты, а затем мы добавляем дополнительную сумму, необходимую для получения нашей новой запрошенной квоты.

Метод возвращает либо True или же Falseчтобы указать, получили ли мы то, о чем просили. Обратите внимание, что Silverlight может решить выделить больше места, чем вы просили.

Вот простой пример увеличения quota, когда нажата кнопка. Ниже приведен код 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>

Вот реализация click событие, при котором квота увеличивается.

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!"; 
               } 
         } 
      } 
   } 
}

Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий результат.

Когда вы нажимаете Increase, появится подсказка. Просит увеличитьQuota быть на 10 КБ больше, чем уже есть.

Когда вы нажимаете Yes, затем он распечатает доступную квоту.

Мы рекомендуем вам выполнить приведенные выше примеры для лучшего понимания.