虽然一般UWP开发还是依赖.Net for UWP,但有时还是需要调用WinRT API。特别是在IO部分,WinRT有着和.Net似曾相识但又不尽相同的接口。在此对经常用到的一些地方进行一下整理。

WinRT IO

Stream

和.Net的Stream体系类似,WinRT中也存在一系统的IO流接口。和c++类似,在WinRT中流被分为input和output:

interface IInputStream
interface IOutputStream
interface IRandomAccessStream : IInputStream, IOutputStream

其中IInputStreamIOutputStream接口提供了基本的异步读写字节操作,不过由于太过抽象,可以加以DataReaderDataWriter包装使用。

IRandomAccessStream则提供了随机访问流,以及在特定偏移处打开input或output流的功能。

IInputStream IRandomAccessStream.GetInputStreamAt(ulong position);
IOutputStream IRandomAccessStream.GetOutputStreamAt(ulong position);
void IRandomAccessStream.Seek(ulong position);

对于以上接口的实现,WinRT提供了InMemoryRandomAccessStream类,用以进行高速内存流的读写。

IO操作类

WinRT提供了DataReaderDataWriter类以对输入、输出流进行操作。

静态的RandomAccessStream类(并非以上接口的实现),用于进行方便的从输入流到输出流的数据拷贝。

static IAsyncOperationWithProgress<UInt64, UInt64> RandomAccessStream.CopyAsync(
IInputStream source, IOutputStream destination, ulong bytesToCopy
);

另外对于常见的文件操作,WinRT提供了两种模式:

  • 一种是基于流来使用StorageFile

    该类实现了IInputStreamReference接口,用于从文件打开输入流;

    IAsyncOperation<IInputStream> StorageFile.OpenSequentialReadAsync();

    还实现了IStorageFile接口,支持打开随机读取流,以对文件进行写入。

    IAsyncOperation<IRandomAccessStream> StorageFile.OpenAsync(FileAccessMode accessMode);
  • 另一种是调用静态FileIO类。该类提供多种读写二进制或文本的方法,都接受一个IStorageFile作为参数。不过较流操作来说方便有余,灵活略欠。

WinRT的IO,和.Net的对比,有如下类似:

WinRT .Net
DataReader/DataWriter BinaryReader/BinaryWriter + 任意流
FileIO StreamReader/StreamWriter(亦是TextRWer) + 文件流

当然也并非这么绝对,两种方法都不是单一的操作字节或文本,也都涉及彼此的领域。

除了文件之外,WinRT也提供了网络IO,如TCP StreamSocket,UDP DatagramSocket。这些类也都提供了相应的获取输入、输出流的属性。

WinRT与其他运行时的转换

WinRT IO流与.Net流的转换(部分方法省略):

namespace System.IO
{
public static classWindowsRuntimeStreamExtensions
{
public static IInputStream AsInputStream(this Stream stream);
public static IOutputStream AsOutputStream(this Stream stream);
public static Stream AsStream(this IRandomAccessStream windowsRuntimeStream);
public static Stream AsStreamForRead(this IInputStream windowsRuntimeStream);
public static Stream AsStreamForWrite(this IOutputStream windowsRuntimeStream);
}
}

WinRT StorageFile到.Net流的转换(部分方法省略):

namespace System.IO
{
public static classWindowsRuntimeStorageExtensions
{
public static Task<Stream> OpenStreamForReadAsync(this IStorageFile windowsRuntimeFile);
public static Task<Stream> OpenStreamForWriteAsync(this IStorageFile windowsRuntimeFile);
}
}

另外在WinRT IO操作中经常会遇到的IBuffer,也有对应的方式和.Net类互转(部分方法省略):

namespace System.Runtime.InteropServices.WindowsRuntime
{
public sealed classWindowsRuntimeBuffer
{
public static IBuffer Create(byte[] data, int offset, int length, int capacity);
public static IBuffer Create(int capacity);
} public static classWindowsRuntimeBufferExtensions
{
public static IBuffer AsBuffer(this byte[] source);
public static Stream AsStream(this IBuffer source);
public static void CopyTo(this byte[] source, int sourceIndex, IBuffer destination, uint destinationIndex, int count);
public static void CopyTo(this IBuffer source, uint sourceIndex, byte[] destination, int destinationIndex, int count);
public static void CopyTo(this IBuffer source, uint sourceIndex, IBuffer destination, uint destinationIndex, uint count);
public static byte[] ToArray(this IBuffer source);
}
}

另外对于C++/CX,获取IBuffer数据可以采取另一种方法,通过IBufferByteAccess接口:

#include <robuffer.h>
using namespace Windows::Storage::Streams; IBuffer ^buffer;
ComPtr<IInspectable> inspectable(reinterpret_cast<IInspectable *>(buffer));
ComPtr<IBufferByteAccess> bufferByteAccess;
inspectable.As(&bufferByteAccess); byte *bytes;
bufferByteAccess->Buffer(&bytes);

可以避免数据的拷贝。

P.S.现在WinRT可能还存在文档比较少的问题,用起来会比较辛苦。相关的整理会慢慢补充。

另外关于文档出处,正如IBufferByteAccess的页面,MSDN上有一些关于C++的参考,其中存在部分和WinRT相同的地方,往往带有更丰富的备注,可供参考,如:

https://msdn.microsoft.com/en-us/library/br205850(v=vs.85).aspx

WinRT IO相关整理的更多相关文章

  1. 你所不知道的 CSS 阴影技巧与细节 滚动视差?CSS 不在话下 神奇的选择器 :focus-within 当角色转换为面试官之后 NPOI 教程 - 3.2 打印相关设置 前端XSS相关整理 委托入门案例

    你所不知道的 CSS 阴影技巧与细节   关于 CSS 阴影,之前已经有写过一篇,box-shadow 与 filter:drop-shadow 详解及奇技淫巧,介绍了一些关于 box-shadow  ...

  2. Innodb Read IO 相关参数源代码解析

    前言:最近在阅读Innodb IO相关部分的源代码.在阅读之前一直有个疑问,show global status 中有两个指标innodb_data_reads 和 innodb_data_read. ...

  3. 与IO相关的等待事件troubleshooting-系列9

    Buffer Cache与IO相关的等待事件: 这种等待事件的产生原因是包含DBWR进程和IO Slaves的Buffer Cache操作. 'db file parallel write' , 'd ...

  4. 文件IO 相关的包:java.io文件——API

    文件IO 相关的包:java.io文件——API 1.Java.io.File类的使用(1)两种路径绝对路径:相对于当前路径:当前为 “工程名”(2)File类创建,对象为一个文件/目录,可能存在或不 ...

  5. socket.io入门整理教程

    socket.io入门整理  发布于 5 年前  作者 dtrex  124983 次浏览  最后一次编辑是 1 年前 我自己在用socket.io开发,对官方网站上的文档,进行简单的整理,然后自己写 ...

  6. IO相关操作

    IO相关操作 对于IO操作而言,有四个基本的操作:open .read .write .close 我们来逐个解释.    在此之前我们先解释一下什么是文件描述符 文件描述符 操作系统通过一个整数开代 ...

  7. git相关整理

    title: git相关整理 toc: false date: 2018-09-24 20:42:55 git merge 和 git merge --no--ff有什么区别? git merge命令 ...

  8. Properties -IO相关的双列集合类

    IO相关的集合类 java.util.Properties集合 extends hashtable(淘汰) Properties类表示了一个持久的属性集.Properties可保存流中或从流中加载 P ...

  9. IO相关Demo

    这几天复习了IO相关知识 只为记录,好记性不如烂笔头 有误请指正 ありがとうございます. 我的公众号 作者:晨钟暮鼓c个人微信公众号:程序猿的月光宝盒 1.判断存在,存在改名,并延迟删除,不存在新建 ...

随机推荐

  1. Postman Postman测试接口之JSON结构化数据提交

    Postman测试接口之JSON结构化数据提交   by:授客 QQ:1033553122 本文主要是针对结构比较复杂一点的JSON协议数据的提交做个简单说明 举例: 用户下订单接口 接口方向 客户端 ...

  2. SQLServer 2005客户端远程连接sql2008 数据库服务器

    SQL2005客户端远程连接sql2008 数据库服务器 by:授客 QQ:1033553122 准备工作: 客户端所在pc机配置: 配置数据源 控制面板-管理工具-ODBC数据源-系统DSN-添加- ...

  3. fastclick select 闪退 bug

    这时候needsclick就派上用场了 <select class='needsclick'></select> 附上fastclick github上的链接

  4. 闲聊jQuery(一)

    Write less, do more. 这便是jQuery的宗旨!jQuery,一个高效.精简并且功能丰富的 JavaScript 工具库. 想必,对于每一个前端开发者,一定用过jQuery吧!俗话 ...

  5. AWS CSAA -- 04 AWS Object Storage and CDN - S3 Glacier and CloudFront(四)

    026 S3 Summary

  6. InfoPath读取List到重复表

    标题设置好了 添加一个按钮 更改ID  点击编写代码 然后添加引用 并更改下域的名字 添加如下代码 public void LoadBtn_Clicked(object sender, Clicked ...

  7. pip 设置国内源

    最近使用 pip 安装包,动辄十几 k 甚至几 k 的下载速度,确实让人安装的时候心情十分不好.所以还是要给 pip 换一个国内的源.可以显著的提升安装速度.有更多的时间来研究算法. 下面,列一下收集 ...

  8. October 20th 2017 Week 42nd Friday

    My life is in these books. Read these and know my heart. 我的人生就在这些书中,读完他们就能读懂我的心. Some people say tha ...

  9. 记录使用git submodule时踩的坑

    在使用git子模块的时候踩了一个坑 在使用git submodule updata --init --recursive命令,即递归更新子模块并初始化时碰到了一个问题: 经过一段不短时间的排查,发现问 ...

  10. PHP常用算法和数据结构示例

    <?php header("content-type:text/html;charset=utf-8"); $arr=array(3,5,8,4,9,6,1,7,2); ec ...