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

Xamarin Android中Directory.GetFiles返回空数组问题求助

Android外部存储中检索PDF文件时Directory.GetFiles返回空数组的问题

我在三星Tab A7设备上,尝试从Android外部存储的多个文件夹中检索所有PDF文件路径并保存为List。目前能正常获取子目录路径,但调用Directory.GetFiles(path, "*.pdf")时返回空数组——即使目标子文件夹内包含1至160个PDF文件,也无异常抛出,仅返回空字符串数组。

补充说明

  • localPath为传入的顶级目录,生成方式见下方GetPath方法
  • allFiles用于存储各目录的文件数组,初始应包含顶级目录的文件
  • subDirectories可通过Directory.GetDirectories正常获取下一层文件夹结构
  • 问题出在foreach循环内:Directory.GetFiles(subDir, "*.pdf")返回空数组,即使文件夹内有文件,尝试将搜索模式改为"*"仍无效

相关代码

检索文件的方法

private List<string[]> GetAllFiles(string localPath)
{
    List<string[]> allFiles = new List<string[]>
    {
        Directory.GetFiles(localPath, "*.pdf")
    };

    string[] subDirectories = Directory.GetDirectories(localPath, "*");

    if (subDirectories.Length > 0)
    {
        foreach (string subDir in subDirectories)
        {
            allFiles.Add(Directory.GetFiles(subDir, "*.pdf"));
        }

    }

    return allFiles;
}

获取父文件夹路径的方法

public string GetPath()
{
    string path = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath + File.Separator + "parent" + File.Seperator;
    return path;
}

AndroidManifest.xml权限配置

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

解决思路

1. 修复路径拼写错误

你的GetPath方法中存在拼写错误:File.Seperator应为File.Separator(少写了一个字母a),这会导致生成的路径无效,是最可能的核心问题。

2. 适配Android分区存储机制

Android 10(API 29)及以上引入分区存储,即使声明了读写权限,直接通过Environment.ExternalStorageDirectory访问目录也可能受限:

  • 在AndroidManifest.xml的<application>标签中添加属性,暂时绕过分区存储限制:
    <application ... android:requestLegacyExternalStorage="true">
    
  • 针对Android 13+,需单独声明文档相关权限,或使用存储访问框架(SAF)获取目录授权。

3. 确保运行时权限已授权

Android 6.0(API 23)及以上需动态申请权限,在代码中添加权限请求逻辑:

if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.ReadExternalStorage) != Permission.Granted)
{
    ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.ReadExternalStorage }, 1);
}

4. 递归遍历所有子目录(可选)

当前代码仅检索一级子目录,若PDF在更深层级,可改用递归遍历:

private void GetFilesRecursively(string path, List<string> allFiles)
{
    allFiles.AddRange(Directory.GetFiles(path, "*.pdf"));
    foreach (string subDir in Directory.GetDirectories(path))
    {
        GetFilesRecursively(subDir, allFiles);
    }
}

// 调用示例
List<string> pdfFiles = new List<string>();
GetFilesRecursively(localPath, pdfFiles);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:23:19