React Native 文件夹复制

react-native-fs / github 已经具备了 iOS 和 Android 文件的复制,删除,查询。
可没有提供文件夹的复制,本文使用递归实现文件夹复制。

iOS 文件夹复制

react-native-fs 的API copyFile(filepath: string, destPath: string): Promise 虽然没有提到 iOS 的文件夹复制,可是它调用 Object-C 的方法 copyItemAtPath:toPath:error:, 同时具备文件和文件夹的复制。

注意:使用过程中,如果那个目标文件或文件夹已经存在,会抛出一个error。

Android 文件夹复制

Android 官方文档没有提供直接复制文件夹的API

自己实现思路如下: 将原始文件夹复制到目标文件夹,思路是遍历原始文件夹,如果子项目是文件,则复制到对应位置,如果子项目是文件夹,则在目标文件夹创建对应的文件夹,递归调用文件夹复制方法。

以下基于 react-native-fs ,以从 App assets 目录下的文件夹复制到目标文件夹为例。
语言: TypeScript 2.6.1
环境:”react-native”: “0.51.0”,”react-native-fs”: “^2.9.11”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import * as RNFS from 'react-native-fs';
import { ReadDirItem } from 'react-native-fs';

private async copy_assets_to_dir(source_dir:string, target_dir:string) {
const target_dir_exist = await RNFS.exists(target_dir);
if (!target_dir_exist) {
await RNFS.mkdir(target_dir);
const exist = await RNFS.exists(target_dir);
}
const items = await RNFS.readDirAssets(source_dir);
for (let i = 0; i < items.length; i++) {
const item = items[i];
if (item.isDirectory()) {
await this.copy_assets_to_dir(`${source_dir}/${item.name}`, `${target_dir}/${item.name}`);
} else {
await RNFS.copyFileAssets(`${source_dir}/${item.name}`, `${target_dir}/${item.name}`);
}
}
}

注意:Android 的 assets 文件夹是只能读取不能修改删除的。

参考

http://www.java2s.com/Code/Android/File/CopyFileandDirectory.htm