react-native-fs仅读取文件夹无法获取文件问题求助
解决react-native-fs仅能读取文件夹无法读取文件的问题
1. 配置必要权限
在android/app/src/main/AndroidManifest.xml中添加对应权限:
<!-- Android 6-9 所需基础存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- Android 13+ 媒体文件细分权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <!-- Android 11+ 访问非媒体文件(如PDF、TXT)需添加,需用户手动授权 --> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
2. 动态申请权限
Android 6+ 要求动态申请权限,用PermissionsAndroid实现:
import { PermissionsAndroid } from 'react-native'; import RNFS from 'react-native-fs'; const requestStoragePermissions = async () => { try { const granted = await PermissionsAndroid.requestMultiple([ PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE, PermissionsAndroid.PERMISSIONS.READ_MEDIA_IMAGES, PermissionsAndroid.PERMISSIONS.READ_MEDIA_AUDIO, PermissionsAndroid.PERMISSIONS.READ_MEDIA_VIDEO, ]); return ( granted['android.permission.READ_EXTERNAL_STORAGE'] === PermissionsAndroid.RESULTS.GRANTED && granted['android.permission.READ_MEDIA_IMAGES'] === PermissionsAndroid.RESULTS.GRANTED && granted['android.permission.READ_MEDIA_AUDIO'] === PermissionsAndroid.RESULTS.GRANTED && granted['android.permission.READ_MEDIA_VIDEO'] === PermissionsAndroid.RESULTS.GRANTED ); } catch (err) { console.warn(err); return false; } };
3. 修改读取逻辑,区分文件与文件夹
调整readFiles函数,先确认权限再读取,同时正确区分文件和文件夹:
const readFiles = async () => { try { const hasPermission = await requestStoragePermissions(); if (!hasPermission) { console.log('存储权限未授权'); return; } const downloadFolderPath = RNFS.DownloadDirectoryPath; const items = await RNFS.readDir(downloadFolderPath); const folders = []; const files = []; // 遍历结果,异步判断类型 for (const item of items) { if (await item.isDirectory()) { folders.push(item); } else { files.push(item); } } console.log('读取到的文件夹:', folders); console.log('读取到的文件:', files); } catch (err) { console.log('读取出错:', err); } };
4. Android 11+非媒体文件访问处理
若需读取PDF、TXT等非媒体文件,Android 11+ 需额外处理:
import { Linking } from 'react-native'; // 引导用户开启全存储访问权限 const requestManageStoragePermission = async () => { try { if (PermissionsAndroid.PERMISSIONS.MANAGE_EXTERNAL_STORAGE) { const granted = await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.MANAGE_EXTERNAL_STORAGE ); if (granted !== PermissionsAndroid.RESULTS.GRANTED) { Linking.openSettings(); } } } catch (err) { console.warn(err); } };
关键注意点
isDirectory()和isFile()是异步方法,必须用await调用才能准确判断类型。- Android 10+的分区存储限制了应用对公共目录非媒体文件的直接访问,需通过存储访问框架(SAF)或特殊权限解决。
- 测试前确认目标目录下确实存在文件,避免因文件不存在导致误判。
内容的提问来源于stack exchange,提问作者naveen
相关产品推荐
相关产品推荐

