在上文我们获取文件的方式都是通过应用程序的三个跟目录的文件夹对象来获取文件夹对象和文件对象,那么我们这一小节来讲解一种新的获取文件对象的方式,这种方式就是通过Uri地址来获取。应用程序存储里面的文件夹和文件其实和我们平时在Windows电脑上看到的文件的目录是一样的,只不过它们是在存储里面,你并不能很直观地看到他们的路径,当然我们还是可以通过StorageFile类的Path属性来查看到文件的保存路径,例如我们查看一个在LocalFolder文件夹的testfile.txt文件的路径会如下所示:
C:\Data\Users\DefApps\APPDATA\Local\Packages\6c522da7-81ed-4463-b58a-584c89af115e_thbaz9fn8knhr\LocalState\testfile.txt
三个根目录文件夹所对应的保存路径的格式分别如下所示:
(1)LocalFolder文件夹的保存路径格式:
%USERPROFILE%\APPDATA \Local\Packages\{PackageId}\LocalState
(2)RoamingFolder文件夹的保存路径格式:
%USERPROFILE%\APPDATA \Local\Packages\{PackageId}\RoamingState
(3)TemporaryFolder文件夹的保存路径格式:
%USERPROFILE%\APPDATA \Local\Packages\{PackageId}\TempState
那本获取到的这个路径其实并不能作为访问文件的路径来使用,访问文件的路径需要使用本地文件夹的ms-appdata的URI方案。LocalFolder文件夹对应的是“ms-appdata:///local/”,RoamingFolder文件夹对应的是“ms-appdata:///roaming/”,TemporaryFolder文件夹对应的是 “ms-appdata:///temp/”。我们可以通过StorageFile类的静态方法GetFileFromApplicationUriAsync来根据URI读取文件,下面的示例代码是使用了ms-appdata的URI方案来获取在LocalFolder文件夹里面的AppConfigSettings.xml文件。
var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/AppConfigSettings.xml"));
在这种通过URI访问文件的方案里面我们还需要注意一个事情,那就是新文件和文件夹的路径在 URI 方案名称的最后一个斜杠后面不能超过 185 个字符。
下面给出通过URI读取文件的示例:该示例演示了创建一个文件之后获取其绝对的路径,读取文件的时候是通过URI方案读取文件。
代码清单6-6:通过URI读取文件(源代码:第6章\Examples_6_6)
MainPage.xaml文件主要代码 ------------------------------------------------------------------------------------------------------------------ <StackPanel> <TextBox Header="文件信息:" x:Name="info" TextWrapping="Wrap"></TextBox> <Button x:Name="bt_save" Content="创建文件" Width="370" Click="bt_save_Click"></Button> <Button x:Name="bt_read" Content="通过Uri读取文件" Width="370" Click="bt_read_Click"></Button> </StackPanel>
MainPage.xaml.cs文件主要代码 ------------------------------------------------------------------------------------------------------------------ // 文件名 private string fileName = "testfile.txt"; // 创建文件 private async void bt_save_Click(object sender, RoutedEventArgs e) { if (info.Text != "") { // 获取本地文件夹根目录文件夹 IStorageFolder applicationFolder = ApplicationData.Current.LocalFolder; // 在文件夹里面创建文件,如果文件存在则替换掉 IStorageFile storageFile = await applicationFolder.CreateFileAsync(fileName, CreationCollisionOption.OpenIfExists); // 使用FileIO类把字符串信息写入文件 await FileIO.WriteTextAsync(storageFile, info.Text); await new MessageDialog("保存成功,文件的路径:" + storageFile.Path).ShowAsync(); } else { await new MessageDialog("内容不能为空").ShowAsync(); } } // 读取文件 private async void bt_read_Click(object sender, RoutedEventArgs e) { // 读取文件的文本信息 string text; try { // 通过Uri获取本地文件 var storageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/" + fileName)); // 打开文件获取文件的数据流 IRandomAccessStream accessStream = await storageFile.OpenReadAsync(); // 使用StreamReader读取文件的内容,需要将IRandomAccessStream对象转化为Stream对象来初始化StreamReader对象 using (StreamReader streamReader = new StreamReader(accessStream.AsStreamForRead((int)accessStream.Size))) { text = streamReader.ReadToEnd(); } } catch (Exception exce) { text = "文件读取错误:" + exce.Message; } await new MessageDialog(text).ShowAsync(); }
本文来源于《深入浅出Windows Phone 8.1 应用开发》
源代码下载:http://vdisk.weibo.com/s/zt_pyrfNHb99O
欢迎关注我的微博@WP林政 微信公众号:wp开发(号:wpkaifa)
WP8.1技术交流群:372552293