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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 06:35:20