win8 文件读取,以及相关流转换(C++) C# 类似
2012-08-30 15:13
281 查看
在Windows 8里面很多API都封装成了异步的形式,因此异步编程成为了Windows 8的一大特色,同时也给Windows 8的应用更好的用户体验和简化了异步编程的复杂度。异步编程在Windows 运行时中是规范,而不是特例。JavaScript、C#、Visual Basic 和 C++ 都各自为异步方法提供了语言支持。
许多 Windows 运行时功能,如 MediaCapture 和 StorageFile,都被公开为异步函数。按照惯例,异步函数的名称以 "Async" 结尾,表示当调用已返回后可能会发生其部分执行。
当你在 Metro 风格应用中使用异步 API 时,你的代码将以一致的方式进行非阻止调用。当你在 API 中实现这些异步模式后,调用者可以理解并按照可预知的方式使用你的代码。
每种编程语言都按照其自己的方式支持异步模式:
下面举几个例子分析一下
using namespace concurrency;异步操作的命名空间,必须加的
using namespace Windows::Storage;
using namespace Windows::Storage::Streams;
using namespace Windows::Storage::Pickers;//文件操作的相关命名空间
(1)使用FileOpenPicker() 打开一个图片文件,并显示
用FileIO 来写入文件
//通过dataReader 把IBuffer读取出来,然后用WriteBytes写到IRandomAccessStream
//把IBuffer读取到数组中,然后用WriteBytesAsync保存
////用dawrite 把IBuffer保存到 IRandomAccessStream 中。用WriteBuffer写到IRandomAccessStream
.文件流直接的转换方式还有很多, 通过dataWtire 和dataReader 的方式就可以进行相应的转换, 这里就不一一介绍了。
需要注意的是:对流操作完之后, 如果要再次使用该文件流, 需要把文件流的位置置为0 调用seek(0).
许多 Windows 运行时功能,如 MediaCapture 和 StorageFile,都被公开为异步函数。按照惯例,异步函数的名称以 "Async" 结尾,表示当调用已返回后可能会发生其部分执行。
当你在 Metro 风格应用中使用异步 API 时,你的代码将以一致的方式进行非阻止调用。当你在 API 中实现这些异步模式后,调用者可以理解并按照可预知的方式使用你的代码。
每种编程语言都按照其自己的方式支持异步模式:
编程语言 | 异步表示形式 |
---|---|
JavaScript | 承诺对象,then 函数 |
C# | 将来对象,await 运算符 |
Microsoft Visual Basic .NET | 将来对象,Await 运算符 |
Visual C++ | task 类,.then 方法 |
using namespace concurrency;异步操作的命名空间,必须加的
using namespace Windows::Storage;
using namespace Windows::Storage::Streams;
using namespace Windows::Storage::Pickers;//文件操作的相关命名空间
(1)使用FileOpenPicker() 打开一个图片文件,并显示
auto openPicker = ref new FileOpenPicker(); openPicker->ViewMode = PickerViewMode::Thumbnail; openPicker->FileTypeFilter->Append("*"); create_task(openPicker->PickSingleFileAsync()).then([this] (StorageFile^ _file) { _sampleFile = _file; create_task(_sampleFile->OpenReadAsync()).then([this] (IRandomAccessStreamWithContentType^ image){ auto bitmapImage = ref new BitmapImage(); bitmapImage->SetSource(image); this->image_Show->Source = bitmapImage; });
用FileIO 来写入文件
create_task(sampleFolder->CreateFileAsync("savefile.jpg",CreationCollisionOption::ReplaceExisting)).then([this,_buffer] (StorageFile^ _file) { //直接保存IBuffer create_task(FileIO::WriteBufferAsync(_file,_buffer)).then([this] (){ Windows::UI::Popups::MessageDialog^ msg = ref new Windows::UI::Popups::MessageDialog("save Successful"); msg->ShowAsync(); }); });
//通过dataReader 把IBuffer读取出来,然后用WriteBytes写到IRandomAccessStream
create_task(_file->OpenAsync(FileAccessMode::ReadWrite)).then([this,_buffer] (IRandomAccessStream^ readStream){ DataReader^ dataReader = DataReader::FromBuffer(_buffer); Array<unsigned char,1>^ myarray =ref new Array<unsigned char,1>(_buffer->Length); dataReader->ReadBytes(myarray); DataWriter^ dataWriter = ref new DataWriter(readStream); dataWriter->WriteBytes(myarray); dataWriter->StoreAsync(); dataWriter->FlushAsync(); Windows::UI::Popups::MessageDialog^ msg = ref new Windows::UI::Popups::MessageDialog("save Successful"); msg->ShowAsync(); });
//把IBuffer读取到数组中,然后用WriteBytesAsync保存
DataReader^ dataReader = DataReader::FromBuffer(_buffer); Array<unsigned char,1>^ myarray =ref new Array<unsigned char,1>(_buffer->Length); dataReader->ReadBytes(myarray); create_task(FileIO::WriteBytesAsync(_file,myarray)).then([this] (){ Windows::UI::Popups::MessageDialog^ msg = ref new Windows::UI::Popups::MessageDialog("save Successful"); msg->ShowAsync(); });
////用dawrite 把IBuffer保存到 IRandomAccessStream 中。用WriteBuffer写到IRandomAccessStream
create_task(_file->OpenAsync(FileAccessMode::ReadWrite)).then([this,_buffer] (IRandomAccessStream^ readStream){ DataWriter^ dataWriter = ref new DataWriter(readStream); dataWriter->WriteBuffer(_buffer); dataWriter->StoreAsync(); dataWriter->FlushAsync(); Windows::UI::Popups::MessageDialog^ msg = ref new Windows::UI::Popups::MessageDialog("save Successful"); msg->ShowAsync(); });
.文件流直接的转换方式还有很多, 通过dataWtire 和dataReader 的方式就可以进行相应的转换, 这里就不一一介绍了。
需要注意的是:对流操作完之后, 如果要再次使用该文件流, 需要把文件流的位置置为0 调用seek(0).
相关文章推荐
- C# 使用FileUpload控件上传图片,将文件转换成二进制进行存储与读取
- Halcon中循环读取文件的实现以及数字与字符的转换
- c#读取图片文件信息并转换成16进制文本方法
- C#读取ini文件数据的方法和后台服务的相关知识
- c#创建xml读取xml方法并判断文件目录以及文件是否存在
- C#复制或删除文件夹(及文件夹下所有子文件夹和文件)、获取文件所在文件夹、二进制读取文件相关
- C# 将xml中二进制文件 转化为视频 以及 根据节点读取节点值
- net9:图片文件转换成二进制流存入SQL数据库,以及从数据库中读取二进制流输出文件
- 一个经过改良的XMLHelper(包含了序列化,反序列化,创建xml文件,读取节点,C#对象与xml文件的相互转换等等。)
- 文件路径以及相关字符格式转换
- C#中如何将信息保存到txt文件中去,以及如何读取
- C# 的泛型以及网络下载Xml文件和读取Xml文件
- 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
- C#生成音频文件以及转换成需要的格式
- C#:CsvReader读取.CSV文件(转换成DataTable)
- 利用java反射机制 读取配置文件 实现动态类加载以及动态类型转换
- 利用java反射机制 读取配置文件 实现动态类加载以及动态类型转换
- Halcon中循环读取文件的实现以及数字与字符的转换
- c#实现对MP4等文件属性信息的读取以及对txt文件内容的读取
- Unity C# TXT文件写入和读取以及Split()的用法