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

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中添加权限:
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
    Android 11及以上更推荐用系统文件选择器让用户手动选择文件,避免复杂的权限处理。
  • UI线程操作:所有更新UI(比如设置txtOriginal.Text、显示Toast)的操作必须在UI线程执行,否则会崩溃或不生效,所以要用RunOnUiThread包裹。

内容的提问来源于stack exchange,提问作者Ron

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 19:08:14