独 立存储是一种数据存储机制,它在代码与保存的数据之间定义了标准化的关联方式,从而提供隔离性和安全性。同时,标准化也提供了其他好处。管理员可以使用旨 在操作独立存储的工具来配置文件存储空间、设置安全策略及删除未使用的数据。通过独立存储,代码不再需要使用唯一的路径来指定文件系统中的安全位置,同时 可以保护数据免遭只具有独立存储访问权限的其他应用程序的损坏。不再需要指示应用程序的存储区域位置的“硬编码”信息。
通过使用独立 存储,可以使部分受信任的应用程序以由计算机安全策略控制的方式存储数据。对于用户需慎重运行的 Web 应用程序和下载的组件来说,这尤为有用。安全策略很少向这种代码授予使用标准 I/O 机制访问文件系统的权限,但是默认情况下,会对在本地计算机、本地网络或 Internet 中运行的代码授予使用独立存储的权限。
当应用程序在文件中存储数据时,必须小心选择文件名和存储位置,最大程度地减小其他应用程序知道该存储位置的可能性,从而使数据不易受到损坏。如果没有标准的系统来处理这些问题,想开发出最大程度地减少存储冲突的特别技术可能并非易事,而且开发出来的技术也不见得可靠。
通过使用独立存储,数据将始终按用户和程序集进行隔离。程序集的源或强名称等凭据确定程序集的身份。通过使用类似的凭据,数据还可以按应用程序域进行隔离。
当 使用独立存储时,应用程序将数据保存到一个与代码标识的某些方面(例如网站、发行者或签名)相关联的独特数据舱。数据舱是一个抽象的存储位置,而不是具体 的存储位置,它由一个或多个独立的存储文件(叫做存储区)组成,这些独立的存储文件包含存储数据的实际目录位置。例如,Web 应用程序可能有一个与其关联的数据舱,文件系统中的某个目录将实现实际保留应用程序数据的存储区。保存在存储区中的数据可以是任意类型的数据,无论是用户 首选项信息还是应用程序状态都可以。对于开发人员,数据舱的位置是透明的;存储区通常驻留在客户端,但服务器应用程序可以通过模拟它所服务的用户来使用独 立存储区存储信息。独立存储还可以将信息和用户漫游配置文件一起存储在服务器上,这样,漫游用户就可以随时使用该信息。
管理员可以根据适当的信任级别限制应用程序或用户可以使用多少独立存储。另外,管理员可以移除用户的所有持久性数据。要创建或访问独立存储,必须授予代码适当的 IsolatedStorageFilePermission。
要 访问独立存储,代码必须具有所有必要的本机平台操作系统权限。例如,在 Windows 2000 上必须满足访问控制列表 (ACL),该列表控制哪些用户具有使用文件系统的权限。除非执行(平台特定的)模拟,否则 Microsoft .NET Framework 应用程序已经具有访问独立存储的操作系统权限。在这种情况下,应用程序负责确保被模拟的用户标识具有访问独立存储的适当操作系统权限。对于在 Web 上运行或从 Web 下载的代码而言,这种访问为之提供了一种读写与特定用户相关的存储区域的简便方法。
有时候,使用操作系统的文件系统 来验证对独立存储进行的更改会非常有帮助。开发人员可能还需要了解独立存储文件的位置。该位置随操作系统的不同而不同。下表显示了在几个常见操作系统上创 建独立存储的根位置。在此根位置下查找 Microsoft\IsolatedStorage 目录。您必须更改文件夹设置以显示隐藏文件和文件夹,才能查看到文件系统中的独立存储。
操作系统 | 在文件系统中的位置 |
---|---|
Windows 98、Windows Me - 未启用用户配置文件 |
支持漫游的存储区 = <SYSTEMROOT>\Application Data 非漫游存储区 = WINDOWS\Local Settings\Application Data |
Windows 98、Windows Me - 启用了用户配置文件 |
支持漫游的存储区 = <SYSTEMROOT>\Profiles\<用户>\Application Data 非漫游存储区 = Windows\Local Settings\Application Data |
Windows NT 4.0 |
<SYSTEMROOT>\Profiles\<用户>\Application Data |
Windows NT 4.0 - Service Pack 4 |
支持漫游的存储区 = <SYSTEMROOT>\Profiles\<用户>\Application Data 非漫游存储区 = <SYSTEMROOT>\Profiles\<用户>\Local Settings\Application Data |
Windows 2000、Windows XP、Windows Server 2003 - 从 NT 4.0 升级 |
支持漫游的存储区 = <SYSTEMROOT>\Profiles\<用户>\Application Data 非漫游存储区 = <SYSTEMROOT>\Profiles\<用户>\Local Settings\Application Data |
Windows 2000 - 全新安装(和从 Windows 98 及 NT 3.51 升级) |
支持漫游的存储区 = <SYSTEMDRIVE>\Documents and Settings\<用户>\Application Data 非漫游存储区 = <SYSTEMDRIVE>\Documents and Settings\<用户>\Local Settings\Application Data |
Windows XP、Windows Server 2003 - 全新安装(和从 Windows 2000 及 Windows 98 升级) |
支持漫游的存储区 = <SYSTEMDRIVE>\Documents and Settings\<用户>\Application Data 非漫游存储区 = <SYSTEMDRIVE>\Documents and Settings\<用户>\Local Settings\Application Data |
获得存储区之后,您可以创建用于存储数据的目录和文件。在存储区中,文件名和目录名是相对于虚文件系统的根目录指定的。
要创建目录,请使用 IsolatedStorageFile 的 CreateDirectory 实例方法。如果您指定一个未创建目录的子目录,则会同时创建两个目录。如果您指定一个已存在的目录,将不会生成任何异常。但是,如果您指定一个包含无效字符的目录名称,则会生成 IsolatedStorageException。
要创建并打开文件,请使用 IsolatedStorageFileStream 构造函数之一,传入文件名、FileMode 值 OpenOrCreate 和要在其中创建文件的存储区。然后,您可以在文件流中对数据执行想要执行的操作,例如读取、搜索和写入。IsolatedStorageFileStream 构造函数还可用于为其他目的打开文件。
通过使用任何不取 IsolatedStorageFile 参数的 IsolatedStorageFileStream 构造函数,您还可以在不首先获得存储区的情况下创建或打开文件。当使用这种形式的构造函数时,文件是在该文件的域存储区中创建的。
在 Windows 文件系统中,为了对名称进行比较,独立存储文件和目录名都不区分大小写。这样,如果您创建了一个名为 ThisFile.txt 的文件,然后又创建了名为 THISFILE.TXT 的另一个文件,实际上只创建了一个文件。显示时,文件名保持其原有的大小写。
CreatingFilesAndDirectories 示例
下面的代码示例阐释如何在独立存储区创建文件和目录。首先,检索一个按用户、域和程序集隔离的存储区并放入 isoStore 变量。CreateDirectory 方法用于设置一些不同的目录,而 IsolatedStorageFileStream 方法则在这些目录中创建一些文件。
Imports System
Imports System.IO
Imports System.IO.IsolatedStorage
Public Module modmain
Sub Main()
' Get an isolated store for user, domain, and assembly and put it into
' an IsolatedStorageFile object.
Dim isoStore As IsolatedStorageFile
isoStore = IsolatedStorageFile.GetStore(IsolatedStorageScope.User Or IsolatedStorageScope.Assembly Or IsolatedStorageScope.Domain, Nothing, Nothing)
' This code creates a few different directories.
isoStore.CreateDirectory("TopLevelDirectory")
isoStore.CreateDirectory("TopLevelDirectory/SecondLevel")
' This code creates two new directories, one inside the other.
isoStore.CreateDirectory("AnotherTopLevelDirectory/InsideDirectory")
' This file is placed in the root.
Dim isoStream1 As New IsolatedStorageFileStream("InTheRoot.txt", FileMode.Create, isoStore)
Console.WriteLine("Created a new file in the root.")
isoStream1.Close()
' This file is placed in the InsideDirectory.
Dim isoStream2 As New IsolatedStorageFileStream("AnotherTopLevelDirectory/InsideDirectory/HereIAm.txt", FileMode.Create, isoStore)
Console.WriteLine("Created a new file in the root.")
isoStream2.Close()
Console.WriteLine("Created a new file in the InsideDirectory.")
End Sub
End Module
using System;
using System.IO;
using System.IO.IsolatedStorage;
public class CreatingFilesDirectories{
public static void Main(){
// Get a new isolated store for this user, domain, and assembly.
// Put the store into an IsolatedStorageFile object.
IsolatedStorageFile isoStore = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Domain | IsolatedStorageScope.Assembly, null, null);
// This code creates a few different directories.
isoStore.CreateDirectory("TopLevelDirectory");
isoStore.CreateDirectory("TopLevelDirectory/SecondLevel");
// This code creates two new directories, one inside the other.
isoStore.CreateDirectory("AnotherTopLevelDirectory/InsideDirectory");
// This file is placed in the root.
IsolatedStorageFileStream isoStream1 = new IsolatedStorageFileStream("InTheRoot.txt", FileMode.Create, isoStore);
Console.WriteLine("Created a new file in the root.");
isoStream1.Close();
// This file is placed in the InsideDirectory.
IsolatedStorageFileStream isoStream2 = new IsolatedStorageFileStream("AnotherTopLevelDirectory/InsideDirectory/HereIAm.txt", FileMode.Create, isoStore);
isoStream2.Close();
Console.WriteLine("Created a new file in the InsideDirectory.");
}// End of Main.
}