首页 > 解决方案 > AssetManager.Open 不支持 Stream.Seek?

问题描述

我目前正在尝试将我的基于 Windows 的游戏移植到 Android 上,但我一直在努力让文件系统加载到移动设备上。

我以某种归档格式存储我的文件,以避免只需要自己制作文件系统来处理不同的文件系统。然而,它依赖于 FileStreams 能够寻求在存档中找到数据的正确位置。

根据Microsoft 的文档,Access.Random 和 Access.Streaming 都应该支持在流中搜索,但无论我做什么,当我从中调用 Stream.Seek 时,使用 AssetManager.Open(string, Access) 创建的流崩溃,给出一个 NotSupportedException。

这是我的错误,还是 SDK 上的已知缺陷,是否有解决方法?

提前致谢。

编辑:根据要求,一个最小的可重现示例。

//class Game is a part of the MonoGame SDK. Game.Activity.Assets is a direct, unmodified version of
//Android.Content.Res.AssetManager, at least according to the docs.
//I believe the Seek function not being supported is a part of Xamarin's SDK, not Monogame's.
Stream stream = Game.Activity.Assets.Open(PathToArchive, Android.Content.Res.Access.Random);

stream.Seek(0, SeekOrigin.Begin); //causes exception regardless of seek value provided, and regardless of where the function is called.

标签: c#androidxamarin.androidfilestream

解决方案


是的,来自的流Assets.Open()确实不支持Seek操作。您可以通过查看CanSeek属性来验证这一点。它会给您false

所以你可以这样做:

Stream stream = Assets.Open(PathToArchive, Android.Content.Res.Access.Random);
MemoryStream ms = new MemoryStream();
stream.CopyTo(ms);
ms.Seek(0, SeekOrigin.Begin);//use ms in place of stream 

推荐阅读