在我们建完项目后可以发现 命名空间 有了Windows 和System 2大顶namespace
这也就是Framwork和WinRT 最明显的区别,至于Framework 和WinRT如何交互 大家请接下来看,MS在这方面做了很好的优化
下面我们以一个实例说明,再次之前先提出一些要点
1. 在Metro Style App 中淡化了硬盘这种概念,所以我们无法直接通过路径访问文件,唯一可以直接 访问的是Libraries下面的文件夹和文件夹
2. 由于Framework和WinRT的同时存在 导致双方的一些API 功能有重叠的情况,所以在这种情况下 一些功能重叠的API被统一,Framework 中IO就没有了Directory,File 等API了 全部换成了Windows.Storage 下StorageFolder,StorageFile,记得我们前面的那副图么 就是最好的说明
我们要做的是在用户目录下写入一些日志文件~当然有更好的位置 稍后再提
async void WriteFiles() { string winRTLog = "WinRT "; string frameWorkLog = "Framwork"; StorageFolder folder = KnownFolders.DocumentsLibrary; StorageFile files = await folder.CreateFileAsync("mydata.txt", CreationCollisionOption.ReplaceExisting); IRandomAccessStream randomAccessStream = await files.OpenAsync(FileAccessMode.ReadWrite); try { // Framework to WinRT Stream stream = randomAccessStream.OpenWrite();
var output = stream.AsOutputStream();
DataWriter dataWriter = new DataWriter(output); dataWriter.WriteString(winRTLog); await dataWriter.StoreAsync(); output.FlushAsync().Start(); //WinRT to Framework IOutputStream outPutStream = randomAccessStream.GetOutputStreamAt(randomAccessStream.Size);
Stream winrtStream = outPutStream.AsStream();
BinaryWriter bw = new BinaryWriter(winrtStream); await Task.Run(() => { bw.Write(frameWorkLog); }); outPutStream.FlushAsync().Start(); } catch (Exception ex) { MessageDialog dlg = new MessageDialog(ex.Message); dlg.ShowAsync().Start(); } }
一开始应该是这样 我们需要有文件存放的地方
StorageFolder
folder =
KnownFolders
.DocumentsLibrary;
KnownFolders是个结构体 里面包含了已知下的Libraries饱含的文件件 包括
返回类型是StorageFolder 也就是 原来的4.0 中的Directory
然后我们需要创建 文件这个对象 ,
代码很简单展示了2种 用WinRT 和Framework 的API 来写入文件,最主要的是 MS做了大量优化利用ASXX() 使得我们可以很方便的 在2者中交互
光靠上面的代码 ,是不能访问这些文件 和文件夹的
我们需要来在前文提到的Package.appxmanifest 中简单的配置下
把Capabilities 中Document Library Access 选中这样我们就可以访问Docment 文件夹,其次
在Declarations 中加入程序支持的文件类型 ,这里选择
File Type Associations,在Supported File Type 中加入支持的类型即可