【51CTO译文】隔离式存储机制的作用在于为Windows Phone系统实现本地数据存储。之所以名为“隔离式”,是因为其它应用程序将无法访问当前特定数据。在今天的文章中,我们将一同对隔离式存储的概念加以了解,并学习如何才能利用它以更为安全的方式在Winodws Phone 8当中进行数据存储。
隔离式存储所采用的移动架构与Windows平台上基于Silverlight的应用程序比较相似。全部I/O操作都被限定在隔离存储范畴之内,而且无法直接访问底层OS文件系统——这就预防了来自其它应用程序的未验证访问及数据损坏问题的发生,从而切实带来安全性保障。如果大家希望在两款应用程序之间进行数据共享,则需要某些支持数据共享功能的云服务作为中转平台。
Here are a few things worth mentioning about isolated storage:本地文件夹也就是我们移动设备当中应用程序数据存储所使用的根文件夹。我们可以通过两种方式实现本地数据存储。***种是通过名为IsolatedStorageSettings的名/值对集合。第二种方式则是利用IsolatedStorageFile创建实际文件及文件夹。下面来看隔离式存储机制当中需要高度关注的几项重要内容:
- 隔离式存储使用权限分配机制,即通过IsolatedStoragePermission对象设定存储限制。
- 如果需要在分配机制之外进行数据写入,则需要通过IsolatedStorageException添加例外。
- IsolatedStorageFilePermission负责决定是否为指定文件或者目录提供权限。
1. URI方案
在处理路径中的本地文件夹时,我们需要利用isostore或者ms-appdata URI方案名。这两种URI方案名允许大家对本地文件夹进行访问,但却无法以互换方式使用。ms-appdata的作用在于通过API处理本地文件夹root,而isostore则负责处理本地文件夹root。以下示例能够很好地展示二者的区别。
- // Create a local database in the local folder with the isostore URI scheme.
- MyDataContext db = new MyDataContext("isostore:/mydb.sdf");
- // Get a file from the local folder with the ms-appdata URI scheme.
- var file = await Windows.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/AppConfigSettings.xml"));
ms-appdata要求使用三个斜杠符号(///)而isostore则只需要使用一个斜杠符号(/)。两种URI方案的路径总长度都不能超过185个字符。
2. IsolatedStorageSettings
将数据添加到隔离式存储中的最简单方式在于利用IsolatedStorageSettings类,也就是通过Dictionary<TKey, TValue>格式将数据以键-值对的方式保存在隔离式存储当中。IsolatedStorageSettings通常被用于保存设置信息,例如每页显示的图片数量以及页面布局选项等等。保存在IsolatedStorageSettings当中的数据会在应用程序启动周期之内持续可用。
如果大家只是希望将设置信息保存为Username = "Fred"这种形式,那么也可以在隔离式存储当中使用ApplicationSettings对象。其使用方式与处理目录时完全相同。saveString方法则可被用于为键name保存一条字符串值message。
- void saveString(string message, string name)
- {
- IsolatedStorageSettings.ApplicationSettings[name] = message;
- IsolatedStorageSettings.ApplicationSettings.Save();
- }
这种存储方式与目录基本类似,但在完成键添加之后不要忘记调用Save进行保存。
为了从设置当中进行值检索,大家可以使用loadString方法将已保存的设置键作为参数加以获取、并在该键确实存在时返回与之对应的值。
- string loadString(string name)
- {
- if (IsolatedStorageSettings.ApplicationSettings.Contains(name))
- {
- return (string)IsolatedStorageSettings.ApplicationSettings[name];
- }
- else
- {
- return null;
- }
- }
在实际进行查找之前,请先行确认该键是否存在。如果大家尝试从某个根本不存在的键中获取与之对应的值,则会出现异常状况。
***实践方式之一在于创建一个特殊的静态类,其中包含我们应用程序的全部设置信息。这种处理办法能够轻松保证我们随时对应用程序中的任何组成部分进行访问。
如果大家正在开发的是通用型Windows应用程序项目,那么使用IsolatedStorageSettings.ApplicationSettings将导致语法错误。大家需要将其替换为Windows.Storage.ApplicationData.Current.LocalSettings。
3. IsolatedStorageFile
大家可以利用IsolatedStorageFile机制将文件保存在用户设备之上。我们能够在隔离式存储当中执行多种操作,例如创建文件夹以及文件、向文件中写入内容、读取数据以及移除文件等等。
这些文件与文件夹无法被同样安装在用户设备上的其它应用程序所访问。其中IsolatedStorageFileStream类负责实现隔离式存储中文件的读取、写入与创建。该类对FileStream进行了拓展,这意味着大家可以在大多数FileStream实例能够起效的场景下使用IsolatedStorageFileStream实例,例如构建StreamReader或者StreamWriter。
文件写入
以下代码片段所示为如何在隔离式存储中实现文件写入。saveGameToIsolatedStorage会在隔离式存储当中创建一个新文件,并将message字符串保存于其中。
- private void saveGameToIsolatedStorage(string message)
- {
- using (IsolatedStorageFile isf =
- IsolatedStorageFile.GetUserStoreForApplication())
- {
- using (IsolatedStorageFileStream rawStream = isf.CreateFile("MyFile.store"))
- {
- StreamWriter writer = new StreamWriter(rawStream);
- writer.WriteLine(message); // save the message
- writer.Close();
- }
- }
- }
文件读取
loadString函数负责读取并返回包含在文件当中的文本内容。该函数利用FileExists首先检查目标文件在隔离式存储内是否存在,而后再利用StreamReader实例对文件进行读取。
- private string loadString()
- {
- string result = null;
- using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
- {
- if (isf.FileExists("Myfile.store")
- {
- using (IsolatedStorageFileStream rawStream = isf.OpenFile(filename,
- System.IO.FileMode.Open))
- {
- StreamReader reader = new StreamReader(rawStream);
- result = reader.ReadLine();
- reader.Close();
- }
- }
- }
- return result;
- }
隔离式存储机制不可用于Windows Store应用程序。相反,这部分应用程序数据类可以用于包含在Windows Runtine API中的Windows.Storage命名空间,从而实现本地数据与文件的保存。
建议大家在不再需要时,将IsolatedStorageFile与IsolatedStorageFileStream实例及时处理掉。using语句能够自动完成上述任务,因此大家应当将其作为***实践广泛使用。
外部文件写入
为了覆盖外部文件的现有内容,大家可以首先使用StreamWriter类将对应文件打开。其中的FileMode.Open与FileAccess.Write参数专门负责打开目标文件并执行写入访问。这样我们就能利用新数据将文件中的原有内容加以覆盖。
- IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication();
- if (myIsolatedStorage.FileExists(filename))
- {
- using (StreamWriter writeFile = new StreamWriter(new IsolatedStorageFileStream(filename, FileMode.Open, FileAccess.Write, myIsolatedStorage)))
- {
- string someTextData = "Learn to code using Tuts+";
- writeFile.WriteLine(someTextData);
- writeFile.Close();
- }
- }
向现有文件中添加内容
向现有文件中添加数据与向现有文件中写入数据非常相似。惟一的区别在于,我们需要在FileMode.Append当中设定文件模式。
- IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication();
- if (myIsolatedStorage.FileExists(filename))
- {
- if (myIsolatedStorage.FileExists(filename))
- {
- using (StreamWriter writeFile = new StreamWriter(new IsolatedStorageFileStream(filename, FileMode.Append, FileAccess.Write, myIsolatedStorage)))
- {
- string someTextData = "Use Tuts+ to Learn Creative Skills, Shape Your Future";
- writeFile.WriteLine(someTextData);
- writeFile.Close();
- }
- }
- }
文本文件删除
要删除一个文本文件,我们首先需要检查该文本文件是否存在于隔离式存储当中,而后利用DeleteFile实现文件删除。
- IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication();
- if (myIsolatedStorage.FileExists(filename))
- {
- myIsolatedStorage.DeleteFile(filename);
- }
在这里,建议大家点击此处查看更多示例应用程序,从而进一步了解如何在文件中读取、写入并添加其它数据。
4. 隔离式存储资源管理器
在对应用程序进行调试的过程中,大家可能需要对应用程序的隔离式存储当中对已经保存的文件及文件夹进行保存,从而验证正确的文件是否被保存在正确的位置。运行有Windows Phone 8或者更低版本的模拟器及设备可以使用Windows Phone Power Tools,这款基于GUI的臣僚能够对各应用程序的隔离式存储内容进行访问。
另一种选择则是使用隔离式存储资源管理器(Isolated Storage Explorer)或者简称ISETool,这款命令行工具随同Windows Phone SDK一同安装。大家可以利用ISETool对应用程序本地文件夹内的文件及目录进行罗列、复制以及替换。
ISETool适用于任何类型的设备或者模拟器,而且通常被安装在以下位置:
Program Files(x86)\MicrosoftSDKs\WindowsPhone\v8.0\Tools\IsolatedStorageExplorerTool
下面来看使用ISETool时需要注意的几点重要事项:
- 应用程序必须被安装在模拟器或者设备当中。
- 该模拟器或者设备必须已经解锁,但应用程序并非必须处于运行状态。
- 大家无法通过Windows Phone Store对已安装应用程序的隔离式存储进行访问。
- 大家无法利用ISETool通过IsolatedStorageSettings类查看所保存的设置信息。
要使用ISETool,大家需要使用以下语法:
1 |
ISETool.exe <cmd[:param]> <target-device[:param]> <product-id> [<desktop-path>] |
下面再来看其它可以通过ISETool实现的操作。
从隔离式存储中将文件复制到计算机当中
- 将大家需要测试的应用程序部署到模拟器或者设备当中,而后创建本地文件及目录。
- 从WMAppManifest.xml文件当中应用元素的ProductID属性处获取应用ID。
- 利用命令提示符前往ISETool.exe,而后运行以下命令将应用程序隔离式存储内的全部文件复制到计算机当中。
1 |
ISETool.exe ts xd f8ce6878-0aeb-497f-bcf4-65be961d4bba c:\data\myfiles |
在隔离式存储中进行文件替换
重复以上三个步骤,而后利用以下命令对应用程序隔离式存储中的文件进行替换。
1 |
ISETool.exe rs xd f8ce6878-0aeb-497f-bcf4-65be961d4bba “C:\Data\My Files” |
如果大家希望了解更多与ISETool相关的信息,不妨点击此处查看我专门就ISETool使用撰写的另一篇文章。
总结
我们在Windows Phone当中拥有两种简单机制可供选择,分别为IsolatedStorageSettings与IsolatedStorageFile。隔离式存储是一套存储区,其中所包含的文件与目录无法被其它应用程序所访问。隔离式存储在多种场景下都能发挥重要作用,也欢迎大家点击此处下载本教程相关源文件作为参考。
原文链接:Working With Isolated Storage on Windows Phone 8
核子可乐译