首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有办法把System.IO.Stream转换成Windows.Storage.Streams.IRandomAccessStream?

有没有办法把System.IO.Stream转换成Windows.Storage.Streams.IRandomAccessStream?
EN

Stack Overflow用户
提问于 2011-10-06 08:46:54
回答 5查看 40.8K关注 0票数 53

在Windows8中,我希望将MemoryStream的内容传递给一个接受Windows.Storage.Streams.IRandomAccessStream类型参数的类。有没有办法把这个MemoryStream转换成IRandomAccessStream?

EN

回答 5

Stack Overflow用户

发布于 2011-10-07 00:06:32

找到了一个更优雅的解决方案:

代码语言:javascript
复制
public static class MicrosoftStreamExtensions
{
    public static IRandomAccessStream AsRandomAccessStream(this Stream stream)
    {
        return new RandomStream(stream);
    }

}

class RandomStream : IRandomAccessStream
{
    Stream internstream;

    public RandomStream(Stream underlyingstream)
    {
        internstream = underlyingstream;
    }

    public IInputStream GetInputStreamAt(ulong position)
    {
        //THANKS Microsoft! This is GREATLY appreciated!
        internstream.Position = (long)position;
        return internstream.AsInputStream();
    }

    public IOutputStream GetOutputStreamAt(ulong position)
    {
        internstream.Position = (long)position;
        return internstream.AsOutputStream();
    }

    public ulong Size
    {
        get
        {
            return (ulong)internstream.Length;
        }
        set
        {
            internstream.SetLength((long)value);
        }
    }

    public bool CanRead
    {
        get { return this.internstream.CanRead; }
    }

    public bool CanWrite
    {
        get { return this.internstream.CanWrite; }
    }

    public IRandomAccessStream CloneStream()
    {
        throw new NotSupportedException();
    }

    public ulong Position
    {
        get { return (ulong)this.internstream.Position; }
    }

    public void Seek(ulong position)
    {
        this.internstream.Seek((long)position, SeekOrigin.Begin);
    }

    public void Dispose()
    {
        this.internstream.Dispose();
    }

    public Windows.Foundation.IAsyncOperationWithProgress ReadAsync(IBuffer buffer, uint count, InputStreamOptions options)
    {
        return this.GetInputStreamAt(this.Position).ReadAsync(buffer, count, options);
    }

    public Windows.Foundation.IAsyncOperation FlushAsync()
    {
        return this.GetOutputStreamAt(this.Position).FlushAsync();
    }

    public Windows.Foundation.IAsyncOperationWithProgress WriteAsync(IBuffer buffer)
    {
        return this.GetOutputStreamAt(this.Position).WriteAsync(buffer);
    }
}
票数 7
EN

Stack Overflow用户

发布于 2013-06-28 08:21:11

Windows8没有内置的way方法。对于Windows8.1,我们添加了一个Stream.AsRandomAccessStream()扩展方法:

代码语言:javascript
复制
internal static IRandomAccessStream ToRandomAccessStream(byte[] array)
{
    MemoryStream stream = new MemoryStream(array);
    return stream.AsRandomAccessStream();
}
票数 4
EN

Stack Overflow用户

发布于 2013-03-12 18:17:07

以上这些对我来说都不起作用(也许在答案发布后,API发生了一些变化)。唯一有效的方法是

代码语言:javascript
复制
IRandomAccessStream inMemoryStream = new InMemoryRandomAccessStream();
using (var inputStream = stream.AsInputStream())
{
    await RandomAccessStream.CopyAsync(inputStream, inMemoryStream);
}
inMemoryStream.Seek(0);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7669311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档