MAUI Android读取Asset文件抛出FileNotFoundException,求解决方案
问题解决步骤
1. 修复异步方法调用问题
CopyFileToAppDataDirectory是异步Task方法,直接调用不会等待文件复制完成,导致后续读取时文件还未生成。必须添加await关键字,同时确保调用它的方法也是异步的:
await CopyFileToAppDataDirectory("vocab.json"); await CopyFileToAppDataDirectory("merges.json"); // 等待复制完成后再初始化Tokenizer var tokenizer = new Tokenizer(new Bpe(GetAssetFilePath("vocab.json"), GetAssetFilePath("merges.json")));
注意:这里修正了Bpe参数里的merges.txt为merges.json,和实际复制的文件名保持一致。
2. 统一文件路径匹配
你的CopyFileToAppDataDirectory把文件复制到了AppDataDirectory/files/目录下,但GetAssetFilePath直接返回AppDataDirectory/文件名,路径不匹配。可以二选一修改:
- 方案一:修改
GetAssetFilePath适配复制路径
string GetAssetFilePath(string assetFileName) { var filesPath = Path.Combine(FileSystem.AppDataDirectory, "files"); return Path.Combine(filesPath, assetFileName); }
- 方案二:修改复制逻辑,直接复制到
AppDataDirectory根目录
public async Task CopyFileToAppDataDirectory(string filename) { using Stream inputStream = await FileSystem.Current.OpenAppPackageFileAsync(filename); string targetFile = Path.Combine(FileSystem.Current.AppDataDirectory, filename); using FileStream outputStream = File.Create(targetFile); await inputStream.CopyToAsync(outputStream); }
3. 修正文件的构建操作设置
Android Assets目录下的文件,构建操作应设置为AndroidAsset,而非EmbeddedResource。EmbeddedResource是将文件嵌入程序集,和Android Assets的读取逻辑不兼容,会导致OpenAppPackageFileAsync无法找到文件。
操作步骤:
- 在解决方案资源管理器中选中
vocab.json和merges.json - 在属性窗口中,将"构建操作"改为
AndroidAsset,"复制到输出目录"保持Copy Always
4. 确保文件路径大小写一致
Android系统文件路径区分大小写,确认代码中使用的文件名和实际文件的大小写完全匹配(比如vocab.json不要写成Vocab.json)。
内容的提问来源于stack exchange,提问作者YaKs
相关产品推荐
相关产品推荐

