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

