win8 文件读取,以及相关流转换(C++) C# 类似

在Windows 8里面很多API都封装成了异步的形式,因此异步编程成为了Windows 8的一大特色,同时也给Windows 8的应用更好的用户体验和简化了异步编程的复杂度。异步编程在Windows 运行时中是规范,而不是特例。JavaScript、C#、Visual Basic 和 C++ 都各自为异步方法提供了语言支持。

许多 Windows 运行时功能,如 MediaCaptureStorageFile,都被公开为异步函数。按照惯例,异步函数的名称以 "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() 打开一个图片文件,并显示

 1 auto openPicker = ref new  FileOpenPicker(); 
 2     openPicker->ViewMode = PickerViewMode::Thumbnail;
 3     openPicker->FileTypeFilter->Append("*");
 4     create_task(openPicker->PickSingleFileAsync()).then([this]
 5     (StorageFile^ _file)
 6     {
 7           _sampleFile = _file;
 8           create_task(_sampleFile->OpenReadAsync()).then([this]
 9            (IRandomAccessStreamWithContentType^ image){
10             auto bitmapImage = ref new BitmapImage();
11             bitmapImage->SetSource(image);
12             this->image_Show->Source = bitmapImage;
13 
14         });

 

 用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).

 

转载于:https://www.cnblogs.com/niannian/archive/2012/08/30/2663821.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值