📜  Silverlight-隔离存储

📅  最后修改于: 2020-11-19 08:39:35             🧑  作者: Mango


第三种文件访问机制是隔离存储机制,该机制提供与登录用户关联的存储。该API通过.NET System.IO命名空间中的Stream类显示数据。因此,与到目前为止我们所研究的其他机制一样,您可以使用System.IO中的其他类型来处理流,从而使您能够存储文本数据或二进制数据。

一些重要的功能是-

  • 这种存储机制称为隔离存储,因为存储是分区的,并且Silverlight应用程序只能访问某些部分。

  • 您无法访问任何旧的存储数据。首先,按用户对存储进行分区。 Silverlight应用程序无法访问的用户不同于已登录并运行该应用程序的用户。

  • 这与您的Web应用程序可能使用的任何识别机制无关。记住这一点很重要,因为某些共享计算机的人不会打扰单独的Windows帐户,而习惯于仅登录和退出他们使用的网站。

使用隔离存储

隔离存储不是Silverlight独有的。该API最初是为Windows窗体引入的,以使从Web启动的应用程序能够在部分信任方案中本地存储数据。实现方式有所不同,无法从Silverlight访问完整的.NET Framework的隔离存储,反之亦然。

但是,如果您使用过它,则此处的步骤将非常熟悉。

  • 首先,请询问用户特定的商店。在这种情况下,我们要为应用程序提供一个。如果我们希望每个站点上的所有XAP共享每个站点的存储,则应调用GetUserStoreForSite

  • 这两种方法都将返回IsolatedStorageFile对象,这是一个非常无用的名称,因为它表示目录,而不是文件。

  • 要访问文件,您需要向IsolatedStorageFile请求一个Stream

  • 我们使用IsolatedStorageFileStream类,其构造函数要求您传递IsolatedStorageFile对象作为参数。

  • 因此,我们正在商店中创建一个新文件。该文件在磁盘上的确切位置是未知的。

  • 包含目录具有随机元素,以使其无法猜测文件名。

  • 否则,恶意网站可能会在用户的计算机上放置一个文件,然后构造一个文件URL来打开它,以期欺骗用户单击本地执行程序的链接。

  • Windows内置了其他各种防护措施,试图防止这种情况的发生,但这是另一种防御层,以防其他方式被禁用或绕开。

  • 该文件将存储在用户个人资料内的某个位置,但是您所知道的就足够了。您的IsolatedStorageFileStream将不会报告其真实位置。

让我们看一个简单的示例,该示例跟踪应用程序已运行了多少次。下面给出的是XAML代码。

 
   
    
       
    
    

这是使用隔离存储的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将询问用户是否愿意为应用程序分配更多空间。

顺便说一下,仅允许您响应用户输入(例如click)要求更多存储空间。如果您尝试在其他时间询问该问题,例如在插件加载时或在计时器处理程序中,Silverlight将自动使请求失败,甚至不会提示用户。额外配额仅适用于与用户进行交互的应用程序。

IsolatedStorageFile对象提供了三个成员来管理配额-

  • 可用空间
  • 增加配额至
  • 配额

可用空间

AvailableFreeSpace属性告诉您剩余的配额数量是可用的。

请注意,即使是空的子目录也会占用您的一些配额,因为操作系统需要在磁盘上分配空间来表示该目录。因此,可用空间可能小于总配额,减去所有文件的总大小。

增加配额至

如果没有足够的空间进行操作,则可以通过调用GrowthQuotaTo方法要求更多空间。

配额

在这里,我们使用第三个属性Quota来发现当前的配额大小,然后添加要获得新的请求配额所需的额外数量。

该方法返回TrueFalse,以指示是否分配了我们要的内容。请注意,Silverlight可能会决定分配超出您要求的空间。

这是单击按钮时增加配额的简单示例。下面给出的是XAML代码。

 
   
    
        
       
   
    

这是增加配额的点击事件的实现。

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

编译并执行上述代码后,您将看到以下输出。

隔离存储配额

当您单击增加时,出现提示。它要求将配额增加到比现有容量大10KB。

孤立增加配额

当您单击“是”时,它将打印出可用的配额。

增加配额

我们建议您执行以上示例以更好地理解。