虽然一般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. mvp在flutter中的应用

    mvp模式的优点mvp模式将视图.业务逻辑.数据模型隔离,使用mvp模式,能使复杂的业务逻辑变得更加清晰,使代码更具有灵活性和扩展性,正是这些优点,使mvp模式广泛应用于原生开发中. flutter使 ...

  2. 如何在单元测试时隔离ORM

    在项目中需要对DAL层进行单元测试,如果直接操作数据库,首先测试速度会大大下降,而且让单元测试直接使用外部依赖,很可能带来后续维护的不便,所以有必要对数据库隔离,然后单独测试DAL层.由于使用了ORM ...

  3. android控件跟随手势滑动改变位置

    要求:1.通过手指移动来拖动图片   2.控制图片不能超出屏幕显示区域 技术点:1.MotionEvent处理2.对View进行动态定位(layout) activity_main.xml: < ...

  4. 数组、ArrayList、链表、LinkedList

    数组   数组 数组类型 不可重复 无序(线性查找) 可重复(找到第一个即可) 无序(线性查找) 不可重复 有序(二分查找) 可重复(找到第一个即可) 有序(二分查找) 插入 O(N) O(1) O( ...

  5. 8.什么是模块,模块的导入,__name__

    相关内容: 什么是模块 模块的导入 模块的导入 自模块的导入 同级目录导入 不同级目录导入 目录内导入目录外 目录外导入目录内 __name__ 首发时间:2018-02-04 15:23 修改: 2 ...

  6. windows7下搭建python环境并用pip安装networkx

    1.安装顺序:Python+pip+pywin32+numpy+matplotlib+networkx 2.版本问题 所安装的所有程序和包都需要具有统一的python版本.系统版本和位宽,所以第一步要 ...

  7. 阿里云rds实例恢复到本地

    摘要: 前提: 1,阿里云数据库备份实例,恢复数据的时候需要将数据恢复到本地数据库,是不能直接恢复到RDS上的. 2,需要在本地服务器上下载一个数据库,尽量和RDS数据库版本保持一致.(我现在用的是5 ...

  8. 适用于 Windows 的自定义脚本扩展

    自定义脚本扩展在 Azure 虚拟机上下载并执行脚本. 此扩展适用于部署后配置.软件安装或其他任何配置/管理任务. 可以从 Azure 存储或 GitHub 下载脚本,或者在扩展运行时将脚本提供给 A ...

  9. 使用 Visual Studio Team Services 和 IIS 创建持续集成管道

    若要将应用程序开发的生成.测试和部署阶段自动化,可以使用持续集成和部署 (CI/CD) 管道. 本教程介绍如何在 Azure 中使用 Visual Studio Team Services 和 Win ...

  10. SQL2005中的事务与锁定(九)-(1)- 转载

    ------------------------------------------------------------------------ -- Author : HappyFlyStone - ...