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

Documents文件夹文件的URI是什么?引用xxx.txt时提示文件未找到怎么办?

正确访问Android外部存储Documents文件夹的方法

首先明确:你用Assets.Open()的方式完全错误,这个方法仅用于读取应用内置assets目录中的资源文件,根本无法访问外部存储的文件。下面是正确的实现步骤:

1. 先处理存储权限

  • Android 9及以下:需要申请READ_EXTERNAL_STORAGE权限;Android 10及以上:可选择申请MANAGE_EXTERNAL_STORAGE权限,或使用存储访问框架(SAF)无需该权限。
  • 在Manifest中添加权限声明:
<!-- Android 9及以下 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- Android 10+ 可选,若用SAF则无需此权限 -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
  • 动态申请权限(以READ_EXTERNAL_STORAGE为例):
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.ReadExternalStorage) != Permission.Granted)
{
    ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.ReadExternalStorage }, 1);
}

2. 获取Documents文件夹的正确路径

不要硬编码路径(不同设备路径可能有差异),用系统API获取:

// 获取公共Documents目录的绝对路径
string documentsDir = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDocuments).AbsolutePath;
// 拼接目标文件的完整路径
string targetFilePath = Path.Combine(documentsDir, "xxx.txt");

3. 读取文件内容

使用普通的文件流读取,而非Assets.Open():

if (File.Exists(targetFilePath))
{
    using (StreamReader sr = new StreamReader(targetFilePath))
    {
        string fileContent = sr.ReadToEnd();
        // 这里处理读取到的文件内容
    }
}
else
{
    // 文件不存在时的处理逻辑
}

4. Android 10+ 分区存储适配

如果你的应用目标API是29及以上,系统默认启用分区存储,直接访问公共目录可能受限,推荐使用**存储访问框架(SAF)**让用户手动选择文件:

// 启动文件选择器
Intent pickFileIntent = new Intent(Intent.ActionOpenDocument);
pickFileIntent.AddCategory(Intent.CategoryOpenable);
pickFileIntent.SetType("text/plain"); // 指定只选文本文件
StartActivityForResult(pickFileIntent, 2);

// 在回调中处理选中的文件
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);
    if (requestCode == 2 && resultCode == Result.Ok)
    {
        Android.Net.Uri fileUri = data.Data;
        // 通过URI打开流读取文件
        using (Stream fileStream = ContentResolver.OpenInputStream(fileUri))
        using (StreamReader sr = new StreamReader(fileStream))
        {
            string content = sr.ReadToEnd();
            // 处理文件内容
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:45:20