本文介绍如何使用 react-native-fs 在 android/ios 上创建可跨应用重装持久保留的文件夹,重点说明系统限制、推荐路径选择及安全创建方法,并提供可直接运行的 typescript/javascript 示例代码。
本文介绍如何使用 react-native-fs 在 android/ios 上创建可跨应用重装持久保留的文件夹,重点说明系统限制、推荐路径选择及安全创建方法,并提供可直接运行的 typescript/javascript 示例代码。
在 React Native 开发中,开发者常希望创建一个“永久性”文件夹用于保存用户生成内容(如缓存资源、导出文件、日志等),并期望该文件夹及其内容在应用卸载后依然保留。但需明确一个关键前提:Android 系统(尤其是 Google Play 审核政策)严格禁止应用直接写入内部存储根目录(如 /sdcard/ 或 /storage/emulated/0/),且自 Android 10(API 29)起,启用分区存储(Scoped Storage)后,对公共目录(如 DCIM、Downloads)的写入也需显式权限和作用域适配。
因此,“在内部存储根目录创建文件夹并持久保留”的需求在合规前提下不可行;但可通过系统提供的应用专属外部存储目录(App-specific external directory) 实现真正的卸载后数据保留——这正是 Android 官方推荐且唯一保证持久性的方案。
✅ 正确路径选择:使用 App-Specific External Directory
Android:对应 getExternalFilesDir(null),路径形如 /storage/emulated/0/Android/data/
/files/
✅ 卸载应用时不会被自动清除(除非用户手动清空或勾选“同时删除应用数据”)
✅ 无需任何运行时权限(READ_EXTERNAL_STORAGE / WRITE_EXTERNAL_STORAGE 已废弃)
✅ 可通过 react-native-fs.DownloadDirectoryPath 访问(该常量在 Android 上实际指向此路径)iOS:对应 NSDocumentDirectory,即 RNFS.DocumentDirectoryPath
✅ 数据受 iCloud 备份影响(可配置排除),但默认随应用沙盒保留
✅ 符合 App Store 审核要求
⚠️ 注意:RNFS.ExternalStorageDirectoryPath(指向 /sdcard/)在 Android 10+ 已被禁用,调用将抛出 EACCES 错误;RNFS.PicturesDirectoryPath 等公共目录需 MANAGE_EXTERNAL_STORAGE 权限(仅限特定用例,且 Google Play 拒绝普通应用申请)。
✅ 安全创建持久化文件夹的完整实现
以下代码使用 react-native-fs 创建名为 myPersistedFolder 的子目录,自动适配双平台路径,并包含存在性检查与错误处理:
import { Platform } from 'react-native';
import RNFS from 'react-native-fs';
const FOLDER_NAME = 'myPersistedFolder';
async function createPersistentFolder(): Promise<string | null> {
try {
// ✅ 获取平台兼容的持久化根路径
const baseDir =
Platform.OS === 'android'
? RNFS.DownloadDirectoryPath // Android: /Android/data/<pkg>/files/
: RNFS.DocumentDirectoryPath; // iOS: NSDocumentDirectory
const folderPath = `${baseDir}/${FOLDER_NAME}`;
// 检查文件夹是否已存在
const exists = await RNFS.exists(folderPath);
if (exists) {
console.log('[RNFS] Persistent folder already exists:', folderPath);
return folderPath;
}
// 创建文件夹(支持嵌套路径)
await RNFS.mkdir(folderPath);
console.log('[RNFS] Persistent folder created successfully:', folderPath);
return folderPath;
} catch (error) {
console.error('[RNFS] Failed to create persistent folder:', error);
// 建议:捕获具体错误类型(如 EACCES、ENOSPC)并做差异化提示
return null;
}
}
// 调用示例(建议在组件挂载或初始化逻辑中执行)
createPersistentFolder().then(path => {
if (path) {
// ✅ 后续可在此路径下安全读写文件
const filePath = `${path}/config.json`;
RNFS.writeFile(filePath, JSON.stringify({ version: '1.0' }), 'utf8')
.then(() => console.log('Config saved'))
.catch(err => console.error('Write failed:', err));
}
});? 关键注意事项
- 不要硬编码路径:始终使用 RNFS.*DirectoryPath 常量,避免因 Android 版本或厂商定制导致路径失效。
- 创建嵌套目录需启用 mkdir 的递归选项(v2.20.0+ 默认支持,旧版本请确认 RNFS.mkdir(path, { NSURLIsExcludedFromBackupKey: true }))。
- iOS 备份控制:若文件夹含临时/可再生数据(如缓存),建议将子文件标记为 NSURLIsExcludedFromBackupKey = true,防止无谓占用 iCloud 配额。
- 权限声明(Android):确保 android/app/src/main/AndroidManifest.xml 中不声明 WRITE_EXTERNAL_STORAGE 等危险权限——现代 react-native-fs 无需它们即可访问 App-specific 目录。
-
测试验证:在真机上彻底卸载应用后重新安装,检查 folderPath 下文件是否仍在(adb 命令:adb shell ls -l /sdcard/Android/data/
/files/myPersistedFolder)。
✅ 总结
创建真正持久化的文件夹,核心在于放弃对“存储根目录”的执念,转而信任系统提供的 App-specific external directory。它既满足数据跨卸载保留的需求,又完全符合 Android/iOS 平台规范与商店审核要求。配合 react-native-fs 的异步 API 和健壮错误处理,即可构建稳定、合规、可维护的本地文件存储方案。










