Учебники

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

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

Некоторые важные особенности —

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Мы используем класс IsolatedStorageFileStream , и его конструктор требует, чтобы вы передавали объект 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 #, в котором используется изолированное хранилище .

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 спросит пользователя, готовы ли они предоставить приложению больше места.

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

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

  • AvailableFreeSpace
  • IncreaseQuotaTo
  • квота

AvailableFreeSpace

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

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

IncreaseQuotaTo

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

квота

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

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

Вот простой пример увеличения квоты при нажатии кнопки. Ниже приведен код 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!"; 
               } 
         } 
      } 
   } 
} 

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

Квота изолированного хранилища

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

Изолированное увеличение квоты

Когда вы нажимаете « Да» , он выводит количество доступной квоты.

Увеличить квоту

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