You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 11:27:28