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

如何用react-native-fs在React Native创建持久化内部存储根目录文件夹

在React Native中创建卸载后能保留的根级别文件夹

先搞清楚关键规则

  • Android:只有外部存储的公共目录下的文件/文件夹,在应用卸载后才会保留;应用的私有内部/外部存储(比如react-native-fs提供的ExternalDirectoryPath)会随应用卸载被彻底删除。
  • iOS:受沙盒机制限制,根本没法在系统存储根目录创建自定义文件夹。如果想让文件在卸载后保留,只能用iCloud或者引导用户把文件存到系统的「文件」应用里。

Android端具体实现

1. 装必要依赖

先把文件操作和权限处理的库装上:

npm install react-native-fs react-native-permissions
# 用yarn的话
yarn add react-native-fs react-native-permissions

2. 配置权限

根据Android版本在AndroidManifest.xml里添加对应权限:

  • Android 12及以下:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- Android 11+ 要访问所有文件的话,加下面这个 -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
  • Android 13+:如果存的是媒体文件,替换为媒体权限;要建非媒体文件夹还是得加MANAGE_EXTERNAL_STORAGE:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

3. 写代码实现

import RNFS from 'react-native-fs';
import {PermissionsAndroid, Platform, Linking} from 'react-native';

// 申请存储权限
const getStoragePermission = async () => {
  if (Platform.OS !== 'android') return true;

  let permissions = [];
  if (Platform.Version >= 33) {
    permissions = [
      PermissionsAndroid.PERMISSIONS.READ_MEDIA_IMAGES,
      PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE
    ];
  } else {
    permissions = [
      PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE,
      PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE
    ];
  }

  const grantStatus = await PermissionsAndroid.requestMultiple(permissions);
  // 检查所有权限是否都通过
  return Object.values(grantStatus).every(status => status === PermissionsAndroid.RESULTS.GRANTED);
};

// 创建根目录下的持久化文件夹
const createRootFolder = async () => {
  const hasPerm = await getStoragePermission();
  if (!hasPerm) {
    console.log('没拿到存储权限,没法创建文件夹');
    // Android 11+ 如果需要MANAGE_EXTERNAL_STORAGE,引导用户去设置开启
    if (Platform.Version >= 30) {
      Linking.openSettings();
    }
    return;
  }

  // 外部存储根目录 + 自定义文件夹名
  const folderPath = `${RNFS.ExternalStorageDirectoryPath}/MyAppPersistentFolder`;
  try {
    const exists = await RNFS.exists(folderPath);
    if (!exists) {
      await RNFS.mkdir(folderPath);
      console.log('文件夹创建成功,路径:', folderPath);
    } else {
      console.log('文件夹已经存在了');
    }
  } catch (err) {
    console.error('创建文件夹失败:', err);
  }
};

// 调用方法执行创建
createRootFolder();

iOS端的替代方案

iOS没法在系统根目录建文件夹,要实现文件卸载后保留,可选以下两种方式:

  • 用iCloud存储:使用react-native-fs的iCloudDirectoryPath,需要在Xcode中开启iCloud能力,文件会存在用户的iCloud空间中,卸载后仍可保留,但依赖用户登录iCloud账号。
  • 引导用户存到「文件」应用:通过UIDocumentPicker让用户选择将文件保存到系统「文件」应用的公共目录,文件独立于应用存在,卸载后不会丢失。

额外提醒

  • Android的MANAGE_EXTERNAL_STORAGE权限无法通过代码直接申请,必须引导用户前往系统设置手动开启。
  • iOS的iCloud存储受用户的iCloud空间限制,需考虑用户未登录iCloud的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 03:26:13