WP7开发解惑(2):如何从安装文件夹拷贝文件到独立存储
2012-04-18 12:11
351 查看
很多朋友在论坛发贴抱怨Windows
Phone 7中无法将安装文件夹中的文件拷贝到独立存储中。我很理解产生这种需求的来源:很多时候我们希望将自己预先定义好的一些配置文件添加到项目中,然后在用户安装程序后,通过代码将配置文件拷贝到独立存储中;或者在使用一些第三方的基于独立存储的数据库时,也希望能够将预先定义的数据库文件从安装文件夹拷贝到独立存储中。那么这种需求究竟能否实现呢?答案是:完全可以!
疑惑1:如何从安装文件夹拷贝文件到独立存储?大部分朋友在尝试以常规的文件系统操作的方式来访问安装文件夹中的文件中,都会遇到类似如下的错误:
Attempt to access the method failed: System.IO.File.Open(System.String, System.IO.FileMode)
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》一文)。
然后,在代码中就可以通过如下方式取得该文件的文件流。
Stream stream = App.GetResourceStream(
new Uri("/DemoCode2;component/Data/MyData.txt", UriKind.Relative)).Stream;
既然文件流获取到了,那么对其进行复制操作就是顺理成章的了。如下代码即可将文件复制到独立存储中。
using (FileStream fileStream =
IsolatedStorageFile.GetUserStoreForApplication().OpenFile("MyData.txt", FileMode.Create))
{
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
fileStream.Write(bytes, 0, bytes.Length);
}
当然,通过GetResourceStream方法也可以解决一些其他类似的问题,如读取安装文件夹中文件。以下代码演示了在获得文件流后读取文件内容并显示。
StreamReader reader = new StreamReader(stream);
string str = reader.ReadToEnd();
借助GetResourceStream方法,即可通过一种变通的方式解决类似的访问安装文件夹中文件(实际编译后已经不再是文件而是嵌入到了dll中)的问题。
疑惑2:是否BuildAction设置为Content的文件就都无法通过C#代码访问了呢?
目前看来,仅考虑Silverlight库时,大多类型文件设置为Content时是无法通过C#代码访问的。但个别类型文件例外:
(1)图片文件可以通过URI访问
Uri uri = new Uri("/Data/Jellyfish.jpg", UriKind.Relative);
BitmapImage bmp = new BitmapImage(uri);
image1.Source = bmp;
(2)XML文件可以借助XElement.Load()方法访问
XElement el = XElement.Load("/Data/AllUsers.xml");
textBlock1.Text = el.ToString();
(3)多媒体文件可以通过MediaPlayerElement访问
疑惑3:是否可能修改安装文件夹中文件?
目前看来,无论文件的BuildAction设置为Resource还是Content、无论是何种类型文件,以上两种访问方式都仅限于读取,无法向安装文件夹写入数据。
下载:点此下载DemoCode
目前看来,仅考虑Silverlight库时,大多类型文件设置为Content时是无法通过C#代码访问的
由于目前还没有深入研究XNA,所以上文讨论的都是仅考虑Silverlight,不考虑XNA框架的情况。经过马宁的提醒,发现原来如果借助XNA库的话,Content类型的文件也是可以访问到的,在此做一补充修正,同时感谢马宁的指正^-^。
当安装文件夹中文件BuildAction设置为为Content时,可以借助XNA库中TitleContainer类的OpenStream()方法获得文件流(先要引用Microsoft.Xna.Framework库)。之后可以按照同样的方法进行文件的操作,如读取、复制等。
Stream stream = Microsoft.Xna.Framework.TitleContainer.OpenStream("Data/MyData2.txt");
也就是说,目前可以通过两种方式访问到安装文件夹中的文件:
(1)当文件为Resource类型时,可通过Application.GetResourceStream方法取得文件流。
(2)当文件为Content类型时,可通过XNA库中的TitleContainer.OpenStream方法获得文件流。
相关文章推荐
- 如何从安装文件夹拷贝文件到独立存储
- 用 WP7开发包 安装 WP7程序(XAP文件)
- 如何用cmd命令递归文件夹中的所有特定文件,拷贝到另一个文件夹中
- Windows内核开发中如何区分文件对象究竟是文件还是文件夹?(FILE_OBJECT包括了无数详细信息)
- 用 WP7开发包 安装 WP7程序(XAP文件)
- 用mfc如何实现将一个文件拷贝到另一个文件夹中例如:C:\WINDOWS\a.txt中的a.txt文件拷贝到D:\Program
- 用INNO SETUP做安装程序时,如何自动注册一个自己开发的DLL文件??
- c#打包,如何让安装程序把一个文件夹拷贝到特定路径
- Android开发实践经验谈:如何让各式手机浏览器可以直接下载apk安装文件且实现自动安装APP
- 每天学点linux--(用shell实现将一个文件夹下面的所有文件拷贝到另一个文件夹下/shell下如何重命名一个文件)
- Android 开发中,如何将多个程序打包成一个apk文件,但是安装完成后显示多个程序?
- APK安装时如何拷贝apk里的文件到sdcard
- 如何配置 windows 安装盘需要拷贝的文件
- 如何用cmd命令递归文件夹中的所有特定文件,拷贝到另一个文件夹中
- Inno如何在安装完成时删除指定的文件夹(下的所有文件及子目录)??
- 在virtualbox中,安装redhat系统,发现在/mnt下面,没有虚拟机设置的share文件夹,如何共享文件呢
- 如何在android模拟器中安装并运行已经开发好的或者别人写好的apk文件 .
- 关于如何解锁你的WP7,以便安装自己开发的程序。
- eclipse开发的文件如何安装的手机上
- 如何破解WP7并安装xap文件