.NET MAUI Android端部署并读取文件失败求助
.NET MAUI Android 读取打包资源文件的正确方案
核心问题分析
你之前的操作存在两个关键错误:
- 混淆了应用包内资源和应用私有数据目录:
FileSystem.Current.AppDataDirectory是应用运行时可读写的私有目录,打包的资源不会自动复制到这里,需要手动复制或者直接从包内读取流。 - 资源文件的放置位置与生成操作配置不匹配,导致资源未被正确打包进APK。
一、正确部署并读取Excel文件(OpenXml方案)
步骤1:统一资源放置位置
不要在Platforms/Android/Resources下单独放文件,直接把Info.xlsx放到项目根目录的Resources/Raw文件夹下(如果没有Raw文件夹就新建)。
步骤2:配置生成操作
右键文件→属性,设置:
- 生成操作:
MauiAsset - 复制到输出目录:
如果较新则复制
或者直接在.csproj里添加(如果没自动生成):
<ItemGroup> <MauiAsset Include="Resources\Raw\Info.xlsx" /> </ItemGroup>
步骤3:正确读取文件
因为OpenXml需要文件路径,而包内资源是只读的,所以需要先把资源流复制到AppDataDirectory再读取:
// 1. 从包内获取资源流 using Stream assetStream = await FileSystem.Current.OpenAppPackageFileAsync("Info.xlsx"); // 2. 复制到应用可读写目录 string targetPath = Path.Combine(FileSystem.Current.AppDataDirectory, "Info.xlsx"); using FileStream fileStream = new FileStream(targetPath, FileMode.Create, FileAccess.Write); await assetStream.CopyToAsync(fileStream); // 3. 用OpenXml读取目标路径的文件 using (SpreadsheetDocument spreadSheetDocument = SpreadsheetDocument.Open(targetPath, false)) { // 你的Excel处理逻辑 }
二、正确读取文本文件
步骤1:简化资源放置
只保留项目根目录Resources/Raw下的AboutAssets.txt,删除Platforms/Android/Resources/Raw下的副本,避免打包冲突。
步骤2:确认生成操作
确保文件的生成操作是MauiAsset,复制到输出目录设置为如果较新则复制。
步骤3:修正读取代码的路径
调用OpenAppPackageFileAsync时,直接传入文件名即可(因为Resources/Raw下的MauiAsset会被打包到根路径),不需要拼接Resources/Raw:
public async Task<string> ReadTextFile(string fileName) { using Stream fileStream = await FileSystem.Current.OpenAppPackageFileAsync(fileName); using StreamReader reader = new StreamReader(fileStream); return await reader.ReadToEndAsync(); } // 调用时直接传文件名 string content = await ReadTextFile("AboutAssets.txt");
如果还是读取为空,检查:
- 文件内容是否为空
- 文件名是否大小写一致(Android文件系统区分大小写)
- 清理项目并重新生成(删除bin/obj目录后Rebuild)
额外注意事项
- Android的Assets目录在MAUI里不需要手动在Platforms下创建,MAUI的
Resources/Raw会统一处理跨平台资源打包。 - 如果需要频繁读取资源文件,建议只复制一次到
AppDataDirectory,避免每次启动都复制。
内容的提问来源于stack exchange,提问作者user20081580
相关产品推荐
相关产品推荐

