.NET MAUI Windows平台FileNotFoundException异常排查求助
.NET MAUI MVVM项目中FileNotFoundException(找不到SuspendedGame文件)的解决方法
问题背景
- 基于MVVM架构开发.NET MAUI项目,在
Resources\Raw目录下创建15.txt和19.txt文件,将生成操作设为MauiAsset,文件存储彩色编码矩阵拓扑信息 - 预期目标:正常读取文件内容,不触发
System.IO.FileNotFoundException,且读取方法可多次成功调用 - 实际现象:
- 未在Debug异常设置中勾选
System.IO.FileNotFoundException时,文件内容可正常读取(页面矩阵图形显示正常),但调用方法时日志会出现该异常(无弹窗提示) - 勾选该异常后,应用无法正常启动
- 未在Debug异常设置中勾选
- 排查结论:异常源于找不到
C:\WINDOWS\system32\SuspendedGame文件,触发点为LoadAsync方法中的using (StreamReader reader = new StreamReader(path))行,且StoredGameBrowserModel类已存在跳过"SuspendedGame"文件的逻辑
原因分析
- MauiAsset文件读取方式错误:直接使用系统文件路径创建
StreamReader读取Resources\Raw下的MauiAsset文件,这类文件是嵌入到应用程序集内的,无法通过物理路径直接访问 - 跳过逻辑执行时机滞后:
StoredGameBrowserModel的跳过逻辑在尝试读取文件之后才执行,导致代码已经触发了文件不存在的异常
解决方案
1. 修正MauiAsset文件的读取方式
对于Resources\Raw下的MauiAsset文件,需使用.NET MAUI提供的FileSystem类读取,替换原有的StreamReader初始化代码:
// 读取15.txt示例 using var stream = await FileSystem.OpenAppPackageFileAsync("15.txt"); using var reader = new StreamReader(stream); var fileContent = await reader.ReadToEndAsync();
2. 提前执行SuspendedGame文件的跳过逻辑
确保在尝试读取文件之前就判断文件名,避免触发异常:
// 在StoredGameBrowserModel的文件遍历逻辑中调整 foreach (var gameFile in gameFiles) { if (gameFile.Name.Equals("SuspendedGame", StringComparison.OrdinalIgnoreCase)) { continue; // 提前跳过,不执行后续读取操作 } // 执行正常的文件读取流程 await LoadAsync(gameFile); }
3. 校验路径传入逻辑
检查LoadAsync方法接收的path参数,避免错误传入系统目录路径(如C:\WINDOWS\system32\)。对于MauiAsset文件,只需传入文件名即可,无需物理路径。
验证步骤
- 替换文件读取代码为上述正确方式
- 调整
StoredGameBrowserModel的跳过逻辑至读取操作之前 - 勾选Debug异常设置中的
System.IO.FileNotFoundException,启动应用验证是否不再触发异常 - 多次调用读取方法,确认文件内容正常加载且无异常日志输出
内容的提问来源于stack exchange,提问作者curiousMind_85
相关产品推荐
相关产品推荐

