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
相关产品推荐
相关产品推荐

