none
IRandomAccessStream转换为IBuffer 出错了 RRS feed

  • 问题

  • 我上次提问了, 你给我的回答是下面的例子。 可是 readStream 代表什么是不是写错了,应该是 inputStream。

    task<IRandomAccessStream^>(file->OpenAsync(FileAccessMode::Read)).then([this](IRandomAccessStream^ stream)
     
    {
         
    IInputStream^ inputStream = stream->GetInputStreamAt(0);
         
    DataReader^ dataReader = ref new DataReader(readStream);
         
    IBuffer^ buffer = dataReader->DetachBuffer();
         
    ......
     
    });

    我用这个代码返回得到一个IBuffer^ buffer,然后调用FileIO::WriteBufferAsync(_file,buffer)

    怎么保存出来的数据是空的。 是不是转换没成功啊?

    2012年6月17日 7:10

答案

  • 不好意思,看了下那个帖子,是贴错了, IInputStream^ inputStream= stream->GetInputStreamAt(0); 应为  IInputStream^ readStream = stream->GetInputStreamAt(0);

    然后,你需要LoadAsync 将inputStream的数据载入DataReader中,buffer才会有数据。

    下面的代码在Windows 8 RP 运行:

    	create_task(KnownFolders::DocumentsLibrary->GetFileAsync("test.txt")).then([this](IStorageFile^ file)
    	{
    		create_task(file->OpenAsync(FileAccessMode::Read)).then([this](IRandomAccessStream^ stream)
    		{
    			IInputStream^ inputStream = stream->GetInputStreamAt(0);
    			DataReader^ dataReader = ref new DataReader(inputStream);
    			create_task(dataReader->LoadAsync((unsigned int)stream->Size)).then([this,dataReader](unsigned int result)
    			{
    				IBuffer^ buffer = dataReader->DetachBuffer();
    				create_task(KnownFolders::DocumentsLibrary->CreateFileAsync("test2.txt", Windows::Storage::CreationCollisionOption::ReplaceExisting)).then([this, buffer](IStorageFile^ file2)
    				{
    					FileIO::WriteBufferAsync(file2, buffer);
    				});
    			});
    		});
    	});




    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年6月18日 9:32
    版主