在上一篇文章中, 介绍了如何使用隔离存储(Isolate Store) ,当然因为篇幅所限, 只用了其中的:
IsolatedStorageSettings
因为它所提供的功能很有限, 而隔离存储所提供的是一整套本地存储的方案,包括目录,文件管理等方面.
本文将会继续上文中的内容,通过一个本地文件系统管理的DEMO来演示一下如果使用下面两个隔离存储类:
IsolatedStorageFile (返回一个包括路径和文件的虚拟区域, 用于管理目录,文件等)
IsolatedStorageFileStream (以流的方式读写指定路径的文件)
首先请大家看一下这个DEMO的演示效果:
我们可以在这里进行目录的选择,文件的选择,以及在相应的目录下添加,编辑,删除工作.而实现这些功能
都用到了上面所说的两个类.
比如IsolatedStorageFile就提供了如下几个常用的方法:
CreateDirectory() //创建路径 Creates a directory in the isolated storage scope.
CreateFile() //创建文件 Creates a file in the isolated store.
DeleteDirectory()//删除路径 Deletes a directory in the isolated storage scope.
DeleteFile() //删除文件
GetDirectoryNames //获取指定路径下的目录列表
GetFileNames //获取指定路径下的文件列表
以及相应的路径文件检查方法:
DirectoryExists()
FileExists()
而另外的一个类是IsolatedStorageFileStream, 它主要是对给定路径下的文件进行流读写操作,我们可以
使用如下方法将其绑定了一个读或写的流对象上:
IsolatedStorageFileStream subDraftFile
=
store.CreateFile(filePath);
using
(StreamWriter writer
=
new
StreamWriter(subDraftFile))
{
//
}
好的,下面是这个DEMO的page.xaml文件代码:
<
Grid
x:Name
="LayoutRoot"
Background
="AntiqueWhite"
>
<
Grid.ColumnDefinitions
>
<
ColumnDefinition
Width
="0.307*"
/>
<
ColumnDefinition
Width
="0.176*"
/>
<
ColumnDefinition
Width
="0.517*"
/>
</
Grid.ColumnDefinitions
>
<
Grid.RowDefinitions
>
<
RowDefinition
Height
="40"
/>
<
RowDefinition
Height
="40"
/>
<
RowDefinition
Height
="231"
/>
<
RowDefinition
Height
="*"
/>
</
Grid.RowDefinitions
>
<
StackPanel
Orientation
="Vertical"
Grid.Row
="0"
Grid.Column
="0"
Grid.RowSpan
="4"
Background
="AliceBlue"
>
<
TextBlock
Grid.Row
="0"
Grid.Column
="1"
HorizontalAlignment
="Stretch"
Margin
="5,5,5,5"
>
<
Run
Text
="路径:"
/>
</
TextBlock
>
<
ListBox
x:Name
="DirectoryList"
SelectionChanged
="DirectoryList_SelectionChanged"
Margin
="5,5,5,5"
/>
<
TextBlock
Grid.Row
="0"
Grid.Column
="1"
HorizontalAlignment
="Stretch"
Margin
="5,5,5,5"
>
<
Run
Text
="文件列表:"
/>
</
TextBlock
>
<
ListBox
x:Name
="FileList"
SelectionChanged
="FileList_SelectionChanged"
Margin
="5,5,5,5"
Height
="150"
/>
</
StackPanel
>
<
TextBlock
Grid.Row
="0"
Grid.Column
="1"
HorizontalAlignment
="Stretch"
Margin
="5,5,5,5"
>
<
Run
Text
="收件人:"
/>
</
TextBlock
>
<
TextBox
x:Name
="Recipient"
Width
="200"
Grid.Row
="0"
Grid.Column
="2"
Margin
="5,5,5,5"
HorizontalAlignment
="Left"
d:LayoutOverrides
="GridBox"
/>
<
TextBlock
Grid.Row
="1"
Grid.Column
="1"
HorizontalAlignment
="Stretch"
Margin
="5,5,5,5"
>
<
Run
Text
="主 题:"
/>
</
TextBlock
>
<
TextBox
x:Name
="Subject"
Width
="200"
Grid.Row
="1"
Grid.Column
="2"
Margin
="5,5,5,5"
HorizontalAlignment
="Left"
d:LayoutOverrides
="GridBox"
/>
<
TextBlock
Grid.Row
="2"
Grid.Column
="1"
HorizontalAlignment
="Stretch"
Margin
="5,5,5,5"
>
<
Run
Text
="内 容:"
/>
</
TextBlock
>
<
TextBox
x:Name
="Body"
TextWrapping
="Wrap"
Grid.Row
="2"
Grid.Column
="2"
Margin
="5,5,5,5"
HorizontalAlignment
="Stretch"
Grid.RowSpan
="1"
d:LayoutOverrides
="GridBox"
RenderTransformOrigin
="0.5,0.5"
>
</
TextBox
>
<
StackPanel
Grid.Row
="3"
Orientation
="Horizontal"
Grid.Column
="1"
Grid.ColumnSpan
="2"
Margin
="0,0,0,8"
>
<
Button
x:Name
="AddToDraft"
Margin
="5,5,5,5"
Content
=" 添加草稿 "
Click
="AddToDraft_Click"
/>
<
Button
x:Name
="SaveToDraft"
Margin
="5,5,5,5"
Content
=" 编辑草稿 "
Click
="SaveToDraft_Click"
/>
<
Button
x:Name
="DeleteDraft"
Margin
="5,5,5,5"
Content
=" 删除当前草稿 "
Click
="DeleteDraft_Click"
/>
</
StackPanel
>
</
Grid
>
而相应的page.xaml.cs文件如下(相关内容见注释):
public
partial
class
Page : UserControl
{
public
Page()
{
InitializeComponent();
this
.Loaded
+=
new
RoutedEventHandler(Page_Loaded);
}
void
Page_Loaded(
object
sender, RoutedEventArgs e)
{
using
(var store
=
System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication())
{
//
如果本地没有文件夹,则初始化本地文件夹信息
if
(
!
store.DirectoryExists(
"
本地文件夹
"
))
{
//
在当前根目录下创建三个目录
store.CreateDirectory(
"
本地文件夹
"
);
//
可使用下面方面在指定目录下创建子目录
store.CreateDirectory(System.IO.Path.Combine(
"
本地文件夹
"
,
"
收件箱
"
));
store.CreateDirectory(System.IO.Path.Combine(
"
本地文件夹
"
,
"
发件箱
"
));
store.CreateDirectory(System.IO.Path.Combine(
"
本地文件夹
"
,
"
草稿箱
"
));
}
//
加载文件夹信息到控件
foreach
(
string
directory
in
GetAllDirectories(
"
*
"
, store))
{
DirectoryList.Items.Add(directory);
}
}
}
///
<summary>
///
添加数据到草稿箱
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
private
void
AddToDraft_Click(
object
sender, RoutedEventArgs e)
{
using
(var store
=
System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication())
{
string
filePath
=
DirectoryList.SelectedItem.ToString();
if
(store.DirectoryExists(filePath))
{
filePath
=
System.IO.Path.Combine(filePath, Subject.Text
+
"
.txt
"
);
if
(
!
store.FileExists(filePath))
{
IsolatedStorageFileStream subDraftFile
=
store.CreateFile(filePath);
using
(StreamWriter writer
=
new
StreamWriter(subDraftFile))
{
writer.WriteLine(
"
Recipient:
"
+
Recipient.Text);
writer.WriteLine(
"
Subject:
"
+
Subject.Text);
writer.WriteLine(
"
Body:
"
+
Body.Text);
}
subDraftFile.Close();
}
else
{
HtmlPage.Window.Alert(
"
文件已存在,请修改主题后再进行保存
"
);
}
}
}
}
///
<summary>
///
保存草稿箱的数据
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
private
void
SaveToDraft_Click(
object
sender, RoutedEventArgs e)
{
using
(var store
=
System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication())
{
string
filePath
=
DirectoryList.SelectedItem.ToString()
+
"
/
"
+
FileList.SelectedItem.ToString();
if
(store.FileExists(filePath))
{
store.DeleteFile(filePath);
IsolatedStorageFileStream subDraftFile
=
store.CreateFile(filePath);
using
(StreamWriter writer
=
new
StreamWriter(subDraftFile))
{
writer.WriteLine(
"
Recipient:
"
+
Recipient.Text);
writer.WriteLine(
"
Subject:
"
+
Subject.Text);
writer.WriteLine(
"
Body:
"
+
Body.Text);
}
subDraftFile.Close();
}
else
{
HtmlPage.Window.Alert(
"
要修改的当前文件不在本地隔离存储!!!
"
);
}
}
}
///
<summary>
///
删除指定草稿
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
private
void
DeleteDraft_Click(
object
sender, RoutedEventArgs e)
{
if
(FileList.SelectedItem
!=
null
)
{
using
(var store
=
System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication())
{
string
filePath
=
DirectoryList.SelectedItem.ToString()
+
"
/
"
+
FileList.SelectedItem.ToString();
if
(store.FileExists(filePath))
{
if
(HtmlPage.Window.Confirm(
"
是否删除文件:
"
+
filePath))
{
store.DeleteFile(filePath);
}
}
}
}
}
///
<summary>
///
分割字符串
///
</summary>
public
static
string
[] SplitString(
string
strContent,
string
strSplit)
{
if
(strContent
!=
null
&&
strContent
!=
""
)
{
if
(strContent.IndexOf(strSplit)
<
0
)
{
string
[] tmp
=
{ strContent };
return
tmp;
}
return
Regex.Split(strContent, Regex.Escape(strSplit), RegexOptions.IgnoreCase);
}
else
{
return
new
string
[
0
] { };
}
}
///
<summary>
///
下面代码从网上获得,用于递归指定路径下的所有目录
///
</summary>
///
<param name="pattern"></param>
///
<param name="storeFile"></param>
///
<returns></returns>
public
string
[] GetAllDirectories(
string
pattern, System.IO.IsolatedStorage.IsolatedStorageFile storeFile)
{
//
Get the root of the search string.
string
root
=
System.IO.Path.GetDirectoryName(pattern);
if
(root
!=
""
) root
+=
"
/
"
;
//
Retrieve directories.
string
[] directories;
directories
=
storeFile.GetDirectoryNames(pattern);
List
<
string
>
directoryList
=
new
List
<
string
>
(directories);
//
Retrieve subdirectories of matches.
for
(
int
i
=
0
, max
=
directories.Length; i
<
max; i
++
)
{
string
directory
=
directoryList[i]
+
"
/
"
;
string
[] more
=
GetAllDirectories(root
+
directory
+
"
*
"
, storeFile);
//
For each subdirectory found, add in the base path.
for
(
int
j
=
0
; j
<
more.Length; j
++
)
more[j]
=
directory
+
more[j];
//
Insert the subdirectories into the list and
//
update the counter and upper bound.
directoryList.InsertRange(i
+
1
, more);
i
+=
more.Length;
max
+=
more.Length;
}
return
(
string
[])directoryList.ToArray();
}
///
<summary>
///
下面代码从网上获得,用于递归指定路径下的所有文件
///
</summary>
///
<param name="pattern"></param>
///
<param name="storeFile"></param>
///
<returns></returns>
public
string
[] GetAllFiles(
string
pattern, System.IO.IsolatedStorage.IsolatedStorageFile storeFile)
{
//
Get the root and file portions of the search string.
string
fileString
=
System.IO.Path.GetFileName(pattern);
string
[] files;
files
=
storeFile.GetFileNames(pattern);
List
<
string
>
fileList
=
new
List
<
string
>
(files);
//
Loop through the subdirectories, collect matches,
//
and make separators consistent.
//
foreach (string directory in GetAllDirectories("*", storeFile))
//
foreach (string file in storeFile.GetFileNames(directory + "/" + fileString))
//
fileList.Add((directory + "/" + file));
return
(
string
[])fileList.ToArray();
}
///
<summary>
///
当用户选择不同的路径时
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
private
void
DirectoryList_SelectionChanged(
object
sender, SelectionChangedEventArgs e)
{
FileList.Items.Clear();
using
(var store
=
System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication())
{
foreach
(
string
file
in
GetAllFiles(DirectoryList.SelectedItem.ToString()
+
"
/
"
, store))
{
FileList.Items.Add(file);
}
}
}
///
<summary>
///
当用户选择相应的文件时
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
private
void
FileList_SelectionChanged(
object
sender, SelectionChangedEventArgs e)
{
if
(FileList.SelectedItem
!=
null
)
{
using
(var store
=
System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForApplication())
{
string
filePath
=
System.IO.Path.Combine(DirectoryList.SelectedItem.ToString(), FileList.SelectedItem.ToString());
if
(store.FileExists(filePath))
{
IsolatedStorageFileStream subDraftFile
=
store.OpenFile(filePath, FileMode.Open);
//
加载指定文件中的内容
using
(StreamReader reader
=
new
StreamReader(subDraftFile))
{
string
[] emailInfo
=
SplitString(reader.ReadToEnd(),
"
\r\n
"
);
foreach
(
string
emailItem
in
emailInfo)
{
if
(emailItem.IndexOf(
"
Recipient
"
)
>=
0
)
{
Recipient.Text
=
emailItem.Split(
'
:
'
)[
1
];
continue
;
}
if
(emailItem.IndexOf(
"
Subject
"
)
>=
0
)
{
Subject.Text
=
emailItem.Split(
'
:
'
)[
1
];
continue
;
}
if
(emailItem.IndexOf(
"
Body
"
)
>=
0
)
{
Body.Text
=
emailItem.Split(
'
:
'
)[
1
];
continue
;
}
}
}
subDraftFile.Close();
}
else
{
HtmlPage.Window.Alert(
"
文件:
"
+
filePath
+
"
不存在!!!
"
);
}
}
}
}
}
其实就我个人而言,我是不太建议过于频繁的使用Isolate Store, 当然主要是出于安全问题的考虑(
因为我本人对它的机制还不是很了解,所以不便妄加评论), 但我本人还是比较偏向于下面这篇文章中的观
点:
临时数据存储可以考虑的方法——IsolatedStorage
好了,今天的内容就先到这里了:)
源代码下载链接, 请点击这里:)