从资源文件/内容获取流

18

这是从资源文件中获取 Stream 的正确/唯一方式吗?

    Uri uri = new Uri(fullPath);

    StorageFile storageFile = 
      await Windows.Storage.StorageFile.
        GetFileFromApplicationUriAsync(uri);

    IRandomAccessStreamWithContentType randomAccessStream = 
      await storageFile.OpenReadAsync();

    IInputStream resourceStream = (IInputStream)
      randomAccessStream.GetInputStreamAt(0);

我的其他资源(http和本地存储)都返回一个 Stream 对象,但是必须写 if-else 代码来使用其中一个对象,这很麻烦。

我也尝试将其转换为 MemoryStream,但我甚至找不到一种方法来获取字节... 请帮帮我。

    uint size = (uint)randomAccessStream.Size;
    IBuffer buffer = new Windows.Storage.Streams.Buffer(size);
    await randomAccessStream.ReadAsync(buffer, size, 
      InputStreamOptions.None);

    Stream stream = new MemoryStream(buffer); // error takes byte[] not IBuffer

当从资源中读取时,使用IInputStream.ReadAsync()方法:

http://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.streams.iinputstream.readasync.aspx

而Stream.Read()和Stream.ReadAsync()方法如下所示:

http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx

http://msdn.microsoft.com/en-us/library/hh137813.aspx

谢谢

2个回答

32

好的,我找到了它!

    StorageFile storageFile =
      await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(uri);

    var randomAccessStream = await storageFile.OpenReadAsync();
    Stream stream = randomAccessStream.AsStreamForRead();

能否将流转换为StorageFile? :o - jdnichollsc
1
非常感谢!你让我的一天变得美好 :)之前尝试将randomAccessStream转换为Byte[]再转换为memoryStream,但是它没有正常工作。 总是失败IRandomAccessStream --> Byte[] 在下面这行代码上 DataReader.LoadAsync((uint)s.Size);现在完美地工作了。 - MSTdev

10

你也可以用更少的一行实现:

Stream stream = await storageFile.OpenStreamForReadAsync(); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接