免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2466 | 回复: 0
打印 上一主题 下一主题

Windows Phone如何从工程文件夹拷贝文件到独立存储IsolatedStorage [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-25 13:55 |只看该作者 |倒序浏览
Windows Phone如何从工程文件夹拷贝文件到独立存储IsolatedStorage





很多朋友在论坛发贴抱怨Windows Phone 7中无法将安装文件夹中的文件拷贝到独立存储中。我很理解产生这种需求的来源:很多时候我们希望将自己预先定义好的一些配置文件添加到项目中,然后在用户安装程序后,通过代码将配置文件拷贝到独立存储中;或者在使用一些第三方的基于独立存储的数据库时,也希望能够将预先定义的数据库文件从安装文件夹拷贝到独立存储中。那么这种需求究竟能否实现呢?答案是:完全可以!
 
疑惑1:如何从安装文件夹拷贝文件到独立存储?

大部分朋友在尝试以常规的文件系统操作的方式来访问安装文件夹中的文件中,都会遇到类似如下的错误:
  1. 1.Attempt to access the method failed: System.IO.File.Open(System.String, System.IO.FileMode)

  2. 2.

  3. 3.  Attempt to access the method failed: System.IO.StreamReader..ctor(System.String, System.Text.Encoding)
复制代码
复制代码


也就是读取安装文件夹中文件失败。其实这在Silverlight中是一个正常现象,是Silverligth的安全机制所决定的。在WP7中我们同样无法打破这种安全机制,那么其实我们所讨论的问题的核心,就是如何正常访问安装文件夹中文件?

  受安全机制所限,通过文件系统的方式显然是不可能了。但是幸运的是,我们还是有其他变通的方法的,那就是:将要访问的文件设置为资源,然后通过Application.GetResourceStream()方法获得资源文件流。

  如要在代码中访问图中所示的“/Data/MyData.txt”文件,可通过如下方法实现。

 首先,将文件的BuildAction属性设置为Resource,这样将保证该文件将来会被以资源形式编译到dll中。(关于Resouce和Content的区别及使用,请参考《BuildAction之Content与Resource》一文)。

  然后,在代码中就可以通过如下方式取得该文件的文件流。
  1. 1. Stream stream = App.GetResourceStream(

  2. 2.

  3. 3.  new Uri("/DemoCode2;component/Data/MyData.txt", UriKind.Relative)).Stream;
复制代码
复制代码既然文件流获取到了,那么对其进行复制操作就是顺理成章的了。如下代码即可将文件复制到独立存储中。
  1. 1. using (FileStream fileStream =

  2. 2.

  3. 3.  IsolatedStorageFile.GetUserStoreForApplication().OpenFile("MyData.txt", FileMode.Create))

  4. 4.

  5. 5.  {

  6. 6.

  7. 7.  byte[] bytes = new byte[stream.Length];

  8. 8.

  9. 9.  stream.Read(bytes, 0, bytes.Length);

  10. 10.

  11. 11.  fileStream.Write(bytes, 0, bytes.Length);

  12. 12.

  13. 13.  }
复制代码
复制代码当然,通过GetResourceStream方法也可以解决一些其他类似的问题,如读取安装文件夹中文件。以下代码演示了在获得文件流后读取文件内容并显示。
  1. 1. StreamReader reader = new StreamReader(stream);

  2. 2.

  3. 3.  string str = reader.ReadToEnd();
复制代码
复制代码借助GetResourceStream方法,即可通过一种变通的方式解决类似的访问安装文件夹中文件(实际编译后已经不再是文件而是嵌入到了dll中)的问题。

疑惑2:是否BuildAction设置为Content的文件就都无法通过C#代码访问了呢?

  目前看来,大多类型文件设置为Content时是无法通过C#代码访问的。但个别类型文件例外:

  (1)图片文件可以通过URI访问
  1. 1.Uri uri = new Uri("/Data/Jellyfish.jpg", UriKind.Relative);

  2. 2.

  3. 3.  BitmapImage bmp = new BitmapImage(uri);

  4. 4.

  5. 5.  image1.Source = bmp;
复制代码
复制代码(2)XML文件可以借助XElement.Load()方法访问
  1. 1. XElement el = XElement.Load("/Data/AllUsers.xml");

  2. 2.

  3. 3.  textBlock1.Text = el.ToString();
复制代码
复制代码(3)多媒体文件可以通过MediaPlayerElement访问

疑惑3:是否可能修改安装文件夹中文件?

  目前看来,无论文件的BuildAction设置为Resource还是Content、无论是何种类型文件,以上两种访问方式都仅限于读取,无法向安装文件夹写入数据。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP