# ReactNativeSaveDocToUserDir
**Repository Path**: scenario-samples/react-native-save-doc-to-user-dir
## Basic Information
- **Project Name**: ReactNativeSaveDocToUserDir
- **Description**: 在应用开发中,有时需要将文件保存到用户目录中以便用户直接查看,本示例通过TurboModule借助HarmonyOS的DocumentViewPicker实现将文件保存到用户目录的功能。
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-02-06
- **Last Updated**: 2026-02-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 保存文件至用户目录
## 场景介绍
在应用开发中,有时需要将文件保存到用户目录中以便用户直接查看,本示例通过TurboModule借助HarmonyOS的[DocumentViewPicker](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-file-picker#documentviewpicker)实现将文件保存到用户目录的功能。
## 效果预览
## 实现思路
1. 编写、配置TurboModule。
```typescript
import {TurboModule, TurboModuleRegistry} from 'react-native';
// 使用自定义的TurboModules
export interface Spec extends TurboModule {
save(): void;
}
export default TurboModuleRegistry.getEnforcing('NativeTools');
```
根据以上代码,使用codegen工具自动生成桥接代码,详细步骤可参考[ArkTS TurboModule的实现](https://gitcode.com/openharmony-sig/ohos_react_native/blob/master/docs/zh-cn/TurboModule.md#arkts-turbomodule%E7%9A%84%E5%AE%9E%E7%8E%B0)。
2. ArkTS侧核心方法实现。
```typescript
import { UITurboModule, UITurboModuleContext } from '@rnoh/react-native-openharmony/ts';
import { TM } from '@rnoh/react-native-openharmony/generated/ts';
import { common } from '@kit.AbilityKit';
import { picker } from '@kit.CoreFileKit';
import { fileIo as fs } from '@kit.CoreFileKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { promptAction } from '@kit.ArkUI';
export class ToolsModule extends UITurboModule implements TM.NativeTools.Spec {
private UIContext: UIContext;
constructor(ctx: UITurboModuleContext) {
super(ctx)
const mainWindow = ctx.uiAbilityContext.windowStage.getMainWindowSync()
this.UIContext = mainWindow.getUIContext()
}
save() {
let context = this.UIContext.getHostContext() as common.UIAbilityContext;
const documentViewPicker = new picker.DocumentViewPicker(context);
const documentSaveOptions = new picker.DocumentSaveOptions();
documentSaveOptions.newFileNames = ['test.txt'];
documentViewPicker.save(documentSaveOptions).then((documentSaveResult: Array) => {
const uri = documentSaveResult[0];
const file = fs.openSync(uri, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
fs.writeSync(file.fd, 'your file content');
fs.closeSync(file.fd);
promptAction.openToast({message: '保存成功'})
}).catch((err: BusinessError) => {
console.error(`Invoke documentViewPicker.save failed, code is ${err.code}, message is ${err.message}`);
})
}
}
```
## 约束与限制
- 本示例支持API Version 17 Release及以上版本。
- 本示例支持HarmonyOS 5.0.5 Release SDK及以上版本。
- 本示例需要使用DevEco Studio 5.0.5 Release及以上版本进行编译运行。
- 本示例使用0.72.86版本RNOH。
- RN工程安装依赖前请先在NativeTools目录下执行`npm pack`命令生成依赖包。
## 工程目录
```
ReactNativeSaveDocToUserDir // RN工程
├──harmony // harmony工程
│ ├──entry/src/main/cpp // native相关配置
│ │ ├──generated // codegen自动生成的桥接代码
│ │ ├──CMakeLists.txt
│ │ └──PackageProvider.cpp
│ ├──entry/src/main/ets
│ │ ├──entryability
│ │ │ └──EntryAbility.ets
│ │ ├──pages
│ │ │ └──Index.ets // harmony侧入口
│ │ ├──turbomodule // TurboModule的ArkTS侧实现
│ │ └──RNPackagesFactory.ets
│ └──entry/src/main/resources/rawfile // bundle、静态资源存放目录
├──NativeModules // 自定义TurboModule模块
├──App.tsx // TurboModule方法调用
├──index.js // 入口文件
├──metro.config.js // 打包配置
```
## 参考文档
[自定义TurboModule的实现](https://gitcode.com/openharmony-sig/ohos_react_native/blob/master/docs/zh-cn/TurboModule.md#%E8%87%AA%E5%AE%9A%E4%B9%89turbomodule%E7%9A%84%E5%AE%9E%E7%8E%B0)
[保存用户文件-保存文档类文件](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/save-user-file#保存文档类文件)