zoukankan      html  css  js  c++  java
  • 在silverlight中使用IsolateStore隔离存储(下)

        
         在上一篇文章中, 介绍了如何使用隔离存储(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      

         好了,今天的内容就先到这里了:)
       
         源代码下载链接, 请点击这里:)

  • 相关阅读:
    oracle基于归档的增量异地恢复 --异地新增数据文件问题
    数据库运行在非归档模式下,数据文件被误删的解决方法
    Archive log restore using RMAN for Logminer (http://www.dba-village.com/village/dvp_forum.OpenThread?ThreadIdA=26816)
    Rsync文件同步服务器配置
    商业研究(17):以小见大,看互联网经济(4个股权众筹平台,4个领域,10个项目,8个图)
    商业研究(17):以小见大,看互联网经济(4个股权众筹平台,4个领域,10个项目,8个图)
    商业研究(16):实体经济之殇,互联网经济之困?
    商业研究(16):实体经济之殇,互联网经济之困?
    JVM——Java虚拟机架构
    Unity高像素截图
  • 原文地址:https://www.cnblogs.com/daizhj/p/1224186.html
Copyright © 2011-2022 走看看