当应用程序在文件中存储数据时,必须小心选择文件名和存储位置,最大程度地减小其他应用程序知道该存储位置的可能性,从而使数据不易受到损坏。如果没有标准的系统来处理这些问题,想开发出最大程度地减少存储冲突的特别技术可能并非易事,而且开发出来的技术也不见得可靠。
通过使用独立存储,数据将始终按用户和程序集进行隔离。程序集的源或强名称等凭据确定程序集的身份。通过使用类似的凭据,数据还可以按应用程序域进行隔离。
当使用独立存储时,应用程序将数据保存到一个与代码标识的某些方面(例如 Web 站点、发行者或签名)相关联的独特数据舱。数据舱是一个抽象的存储位置,而不是具体的存储位置,它由一个或多个独立的存储文件(叫做存储区)组成,这些独立的存储文件包含存储数据的实际目录位置。例如,Web 应用程序可能有一个与其关联的数据舱,文件系统中的某个目录将实现实际保留应用程序数据的存储区。保存在存储区中的数据可以是任意类型的数据,无论是用户首选项信息还是应用程序状态都可以。对于开发人员,数据舱的位置是透明的;存储区通常驻留在客户端,但服务器应用程序可以通过模拟它所服务的用户来使用独立存储区存储信息。独立存储还可以将信息和用户漫游配置文件一起保存在服务器上,这样漫游用户就可以随时使用该信息。
管理员可以根据适当的信任级别限制应用程序或用户可以使用多少独立存储。另外,管理员可以移除用户的所有持久性数据。
要访问独立存储,代码必须具有所有必要的本机平台操作系统权限。例如,在 Windows 2000 上必须满足访问控制列表 (ACL),该列表控制哪些用户具有使用文件系统的权限。除非执行(平台特定的)模拟,否则 Microsoft .NET Framework 应用程序已经具有访问独立存储的操作系统权限。在这种情况下,应用程序负责确保被模拟的用户标识具有访问独立存储的适当操作系统权限。对于在 Web 上运行或从 Web 下载的代码而言,这种访问为之提供了一种读写与特定用户相关的存储区域的简便方法。
有时候,使用操作系统的文件系统来验证对独立存储进行的更改会非常有帮助。开发人员可能还需要了解独立存储文件的位置。该位置随操作系统的不同而不同。您必须更改文件夹设置以显示隐藏文件和文件夹,才能查看到文件系统中的独立存储。-
//TODO: Write a ReadUserPreferences method
private void ReadUserPreferences()
{
try
{
IsolatedStorageFile isFile =
IsolatedStorageFile.GetStore(
IsolatedStorageScope.User
| IsolatedStorageScope.Assembly
, null
, null);
IsolatedStorageFileStream isFileStream = new
IsolatedStorageFileStream("Settings.isf"
, FileMode.Open
, isFile);
IFormatter formatter = new
//System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
BinaryFormatter();
this.Size = (Size)formatter.Deserialize(isFileStream);
this.Location = (Point)formatter.Deserialize(isFileStream);
if(null!=isFileStream)
isFileStream.Close();
if(null!=isFile)
isFile.Close();
}
catch(System.IO.FileNotFoundException e)
{
//Eat this error...
}
}
//TODO: Write a WriteUserPreferences method
private void WriteUserPreferences()
{
IsolatedStorageFile isFile =
IsolatedStorageFile.GetStore(
IsolatedStorageScope.User
| IsolatedStorageScope.Assembly
, null
, null);
IsolatedStorageFileStream isFileStream = new
IsolatedStorageFileStream("Settings.isf"
, FileMode.OpenOrCreate
, isFile);
IFormatter formatter = new
//System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
BinaryFormatter();
formatter.Serialize(isFileStream, this.Size);
formatter.Serialize(isFileStream, this.Location);
if(null!=isFileStream)
isFileStream.Close();
if(null!=isFile)
isFile.Close();
}