Android平台C# Xamarin应用读取文件失败问题排查
问题分析与解决方案
核心问题1:AssetManager用法错误
你用AssetManager.Open(testFile)完全不对——AssetManager是用来读取项目内嵌的Assets资源文件(比如添加到项目Assets文件夹、设置“AndroidAsset”生成操作的文件),不是读取设备文件系统里的AppData或Documents目录下的文件。用设备文件路径调用assets.Open()会直接抛出异常,这就是代码卡在1033之后的原因,大概率是异常被抛出但你的MakeToast没在UI线程执行,导致没显示错误提示。
核心问题2:文件存在性判断错误
你写的if (testFile.Length > 0)是判断路径字符串的长度,不是文件的大小或是否存在。哪怕文件根本不存在,只要路径字符串不为空,这个条件就会成立,完全起不到判断文件是否存在的作用。
修复代码(读取AppData目录的文件)
把代码改成这样,直接用System.IO.File类读取设备文件:
try { var fileName = "jason.txt"; MakeToast(fileName); var testFile = Path.Combine(Xamarin.Essentials.FileSystem.AppDataDirectory, fileName); MakeToast(testFile); MakeToast("102"); // 正确判断文件是否存在 if (File.Exists(testFile)) { MakeToast("103"); string content; // 直接读取设备文件,不用AssetManager using (StreamReader sr = new StreamReader(File.OpenRead(testFile))) { MakeToast("104"); content = sr.ReadToEnd(); // 确保在UI线程更新控件 RunOnUiThread(() => txtOriginal.Text = content); } if (content != null) MakeToast("105"); else MakeToast("null content"); } else MakeToast("文件不存在"); } catch (Exception ex) { // 确保异常提示在UI线程显示 RunOnUiThread(() => MakeToast(ex.Message)); }
读取Documents文件夹的文件
如果要读取设备的Documents目录(Android外部存储、iOS应用Documents文件夹),用FileSystem.DocumentDirectory替换AppDataDirectory即可:
var docsFile = Path.Combine(Xamarin.Essentials.FileSystem.DocumentDirectory, "jason.txt"); if (File.Exists(docsFile)) { string content = File.ReadAllText(docsFile); RunOnUiThread(() => txtOriginal.Text = content); }
额外注意事项
- Android权限:如果是读取Android外部存储的Documents目录(非应用私有),需要在
AndroidManifest.xml中添加权限:
Android 11及以上更推荐用系统文件选择器让用户手动选择文件,避免复杂的权限处理。<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> - UI线程操作:所有更新UI(比如设置
txtOriginal.Text、显示Toast)的操作必须在UI线程执行,否则会崩溃或不生效,所以要用RunOnUiThread包裹。
内容的提问来源于stack exchange,提问作者Ron
相关产品推荐
相关产品推荐

