WinRT IO相关整理
虽然一般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
其中IInputStream和IOutputStream接口提供了基本的异步读写字节操作,不过由于太过抽象,可以加以DataReader、DataWriter包装使用。
IRandomAccessStream则提供了随机访问流,以及在特定偏移处打开input或output流的功能。
IInputStream IRandomAccessStream.GetInputStreamAt(ulong position);
IOutputStream IRandomAccessStream.GetOutputStreamAt(ulong position);
void IRandomAccessStream.Seek(ulong position);
对于以上接口的实现,WinRT提供了InMemoryRandomAccessStream类,用以进行高速内存流的读写。
IO操作类
WinRT提供了DataReader、DataWriter类以对输入、输出流进行操作。
静态的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相关整理的更多相关文章
- 你所不知道的 CSS 阴影技巧与细节 滚动视差?CSS 不在话下 神奇的选择器 :focus-within 当角色转换为面试官之后 NPOI 教程 - 3.2 打印相关设置 前端XSS相关整理 委托入门案例
你所不知道的 CSS 阴影技巧与细节 关于 CSS 阴影,之前已经有写过一篇,box-shadow 与 filter:drop-shadow 详解及奇技淫巧,介绍了一些关于 box-shadow ...
- Innodb Read IO 相关参数源代码解析
前言:最近在阅读Innodb IO相关部分的源代码.在阅读之前一直有个疑问,show global status 中有两个指标innodb_data_reads 和 innodb_data_read. ...
- 与IO相关的等待事件troubleshooting-系列9
Buffer Cache与IO相关的等待事件: 这种等待事件的产生原因是包含DBWR进程和IO Slaves的Buffer Cache操作. 'db file parallel write' , 'd ...
- 文件IO 相关的包:java.io文件——API
文件IO 相关的包:java.io文件——API 1.Java.io.File类的使用(1)两种路径绝对路径:相对于当前路径:当前为 “工程名”(2)File类创建,对象为一个文件/目录,可能存在或不 ...
- socket.io入门整理教程
socket.io入门整理 发布于 5 年前 作者 dtrex 124983 次浏览 最后一次编辑是 1 年前 我自己在用socket.io开发,对官方网站上的文档,进行简单的整理,然后自己写 ...
- IO相关操作
IO相关操作 对于IO操作而言,有四个基本的操作:open .read .write .close 我们来逐个解释. 在此之前我们先解释一下什么是文件描述符 文件描述符 操作系统通过一个整数开代 ...
- git相关整理
title: git相关整理 toc: false date: 2018-09-24 20:42:55 git merge 和 git merge --no--ff有什么区别? git merge命令 ...
- Properties -IO相关的双列集合类
IO相关的集合类 java.util.Properties集合 extends hashtable(淘汰) Properties类表示了一个持久的属性集.Properties可保存流中或从流中加载 P ...
- IO相关Demo
这几天复习了IO相关知识 只为记录,好记性不如烂笔头 有误请指正 ありがとうございます. 我的公众号 作者:晨钟暮鼓c个人微信公众号:程序猿的月光宝盒 1.判断存在,存在改名,并延迟删除,不存在新建 ...
随机推荐
- android-studio开发NDK错误记录:bash: ../../build/intermediates/classes/debug: is a directory
按照网上很多已有的教程,在用javah生成c的头文件时候报错: Error: no classes specified bash: ../../build/intermediates/classes/ ...
- 抽象数据类型(ADT)
概念 抽象数据类型(ADT),脱离具体实现定义数据结构,它的定义着重于做什么,而忽略怎么做 举例 列表.栈.队列 列表 列表,也叫线性表 抽象定义:数据项线性排列,可以插入某一项,删除某一项,读取某一 ...
- Java:运算符的问题
算术运算符: 算术运算符的注意问题 1. 如果对负数取模,可以把模数负号忽略不记,如:5%-2=1.但被模数是负数就另当别论. -5%3=-2:-5%-3=-2:符号跟被模数(左边). 2. 对于除号 ...
- python 版本升级
python 版本升级 升级python 查看python的版本 python -V Python 2.6.6 下载新版本 wget https://www.python.org/ftp/python ...
- 记一款bug管理系统(bugdone.cn)的开发过程(3) - 永久免费化
BugDone永久免费了! BugDone(bug管理工具)已经发布有一阵子了,自发布以来注册用户量.项目创建量稳步提升,并且得到了很多用户的好评. 在开发BugDone工具之前,我们团队也曾为找不到 ...
- web调试-禁止/清空chrome页面缓存
Chrome会对页面缓存,web页面调试的时候,后端修改页面.js之后,刷新页面经常不生效,非常不方便. 有一些小技巧可以解决该问题. 技巧一: 开发者工具-setting/设置,可以关闭缓存. 开发 ...
- Sql Server中的游标最好只用于有主键或唯一键的表
游标cursor,我想大多数人都在sql server里面用过.当一个表数据量不太大的时候,游标还是可以用的,毕竟游标是循环一个表中每一行数据的最简便办法.但是如果你用一个游标去循环一个没有主键或唯一 ...
- win10的ie11正确卸载与重新安装
win10的ie11是自带与斯巴达共存的浏览器,不正确的卸载或安装可能会导致不可预知的问题,以下为我总结出来正确的方法: 卸载: 进入 控制面板--程序与功能 之后在左侧选择 “启动与关闭Window ...
- SELECT查询结果集INSERT到数据表
简介 将查询语句查询的结果集作为数据插入到数据表中. 一.通过INSERT SELECT语句形式向表中添加数据 例如,创建一张新表AddressList来存储班级学生的通讯录信息,然后这些信息恰好存在 ...
- 通过HTTP参数污染绕过WAF拦截 (转)
上个星期我被邀请组队去参加一个由CSAW组织的CTF夺旗比赛.因为老婆孩子的缘故,我只能挑一个与Web漏洞利用相关的题目,名字叫做”HorceForce”.这道题价值300点.这道题大概的背景是,你拥 ...