📅  最后修改于: 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来发现当前的配额大小,然后添加要获得新的请求配额所需的额外数量。
该方法返回True或False,以指示是否分配了我们要的内容。请注意,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。
当您单击“是”时,它将打印出可用的配额。
我们建议您执行以上示例以更好地理解。