起初我想从SD卡上读取文件可以从两个方面着手吧:
1.通过文件选择器FileOpenPicker,来逐层到手机找到需要读取的文件,然后点击直接读取显示内容
2.直接到SD卡中读取文件
第一种方法逻辑有些复杂,设计到应用暂时的挂起和恢复,这篇博客不深究这种方法
第二种方法,相对于来说逻辑就比较简单了。只要获取到SD卡对象,遍历里面的文件或者直接指定某一个文件夹,接下
来就是读取文件内容或文件夹中的内容了。
对于上面的两种方法,作为初学者的我最近都尝试了好几遍,着实感觉学到了好多。多次逛博客,贴吧,论坛,在百度
也千百度次,下面总结我看到很好的几篇关于此的博客,推荐给大家:
首先微软的MSDN是最全的介绍文档,虽然我不太喜欢它太过书面化的解释,每次偏偏把一个本来就难理解的说成更难
理解的,这样很容易让读者望而生畏的。但是,不能否认它确实是一个学习的好工具!
MSDN中相关的资料(本章重点看KnownFolders):Windows.Storage Namespace
编程小梦:WP8.1开发:SD卡读写特定类型文件
小强孩(ExternalStorageDevice已经不支持了):Windows Phone 8上的SD 卡读取---读取音频文件并设置为手机铃声
LiPan(内容略老一些,好多已经不支持了):Windows phone 8 学习笔记(4) 应用的启动--文件关联以及SD卡访问
下面是我的一些个人感悟和总结,大家其实看了以上博客就应该明白了八九分了,有需要的话我的可以凑合看看。
首先,要读取SD卡里的文件,可是要权限的,不能无缘无故就让你去读取或者写入。所以在真正写代码之前,还得做
一些准备工作。
第一:让手机知道你要访问SD里的文件,你提出这个需求,这样它才能指定你可以使用这个功能。
当然你也可以以xml的格式打开Package.appxmanifest,然后在里面自己添上一句代码即可:
第二:你获得了访问SD卡中文件的权限之后,还要申明访问哪个格式的文件(添加申明,申明中指定文件类型关联)
当然你依然可以自己写代码,以XML的形式打开上面的文件:
好了,准备工作做好了,下面就可以*发挥写代码了:
第一步:
如何获取SD卡呢?代码之前补充:
MSDN中KnownFolders类的解释:KnownFolders Class
MSDN中StorageFolder类的解释:StorageFolder Class
第二步:
获取SD卡文件夹并新建文件夹及文件并写入内容:
(newFolder是定义的全局StorageFolder对象;textblock是XAML页面的TextBlock标签的name属性)
var devices = Windows.Storage.KnownFolders.RemovableDevices;//返回StorageFolder类型 var SDUnion = await devices.GetFoldersAsync();//获取当前文件夹的*子文件夹的列表(SD卡就可以看作是文件夹) if (SDUnion.Count == 0) return; StorageFolder firstCard = SDUnion[0]; //你可以这样想上面的代码,获取插入手机的SD卡集合(其实一般都是一张SD卡,但是样子还是要做起来的),然后获取集合第一张SD卡(sdCards[0]) //在当前文件夹内新建子文件夹,并指定如果当前文件夹中存在具有相同名称的文件夹时应执行的操作.返回StorageFolder类型 newFolder = await firstCard.CreateFolderAsync("Test", CreationCollisionOption.OpenIfExists); //在当前文件夹中新建文件,并指定如果文件的名称与当前文件夹中已有文件重复时进行什么操作.返回StorageFile类型 StorageFile newFile = await newFolder.CreateFileAsync("Demo.txt", CreationCollisionOption.ReplaceExisting); await FileIO.WriteTextAsync(newFile, textblock.Text, Windows.Storage.Streams.UnicodeEncoding.Utf8);
读取的流程近乎一样,把上面代码最后两行的写入换成读取的代码即可:
StorageFile newFile = await newFolder.GetFileAsync("test.txt"); textblock.Text = await FileIO.ReadTextAsync(newFile);
当然我们不是每次进去都是要新建一个文件,并且判断是否存在这个文件,如果已经存在就利用OpenIfExists来获取
这个文件对象,这种方法太取巧。
大家不要思维定式,上面只是在新建文件的前提下进行的。要想按自己的意思办,就得好好看我上面给出的MSDN相关
的文档资料。
MSDN中GetFolderAsync(string name)方法:GetFolderAsync(string name)方法
当我们需要获得一个我们知道的名字的文件的时候,直接通过StorageFolder类的GetFolderAsync()方法获得
newFolder = await firstCard.GetFolderAsync("Test");