c# - 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.
解决方案
是的,来自的流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
推荐阅读
- php - 在 curl 请求中传递参数
- swift - SwiftUI macOS 使用 SF Symbols 2
- java - 如何在矢量上轻松制作(球体)3d点的网格?
- python - 无法连接到 Tryton 服务器
- forms - 付费发布 - 会员网站
- youtrack - Office 组织 (sharepoint) 的 Jetbrains Hub Microsoft auth 模块配置
- mysql - 有没有办法使用 JPA 查询更新 SET 类型列?
- kubernetes - 基于 NATS 服务器中发布的事件数量的水平缩放
- rust - 如何错误处理字符串到浮点数的转换
- python - Pandas read_html() 没有在表格中给出我的所有条目