HarmonyOS 鸿蒙Next文件管理
HarmonyOS 鸿蒙Next文件管理 如何在应用的沙箱目录下创建指定名称的子目录
并在这个子目录下创建或者读取删除(一个或者多个)指定名称的子文件
1、使用应用上下文(context)获取沙箱目录路径,拼接指定子目录名称,使用fs.mkdir创建目录。
2、使用fs.openSync以读写模式创建文件
3、使用fs.unlink 和 fs.rmdir 删除文件和目录
import { fileIo as fs } from '@kit.CoreFileKit'
@Entry
@Component
struct Index {
@State message: string = '正在读取内容'
aboutToAppear(): void {
this.fileDemo()
}
build() {
Column() {
Text(this.message)
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
async fileDemo() {
const context = this.getUIContext().getHostContext()
const subDirPath = `${context?.cacheDir}/` + 'mySubDir';
await this.createSubDir(subDirPath)
const filePath = subDirPath + '/test.txt'
await this.createFile(filePath)
this.message = await this.readFile(filePath)
console.log('读取到=====' + this.message)
}
// 在沙箱filesDir下创建子目录
async createSubDir(subDirPath: string) {
if (!fs.accessSync(subDirPath)) {
await fs.mkdir(subDirPath);
}
}
// 创建文件
async createFile(filePath: string) {
try {
const file = fs.openSync(filePath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE | fs.OpenMode.TRUNC);
const content: string = "Hello, 仙银";
await fs.write(file.fd, content);
fs.closeSync(file.fd);
} catch (e) {
console.error(e)
}
}
// 读取文件内容
async readFile(filePath: string): Promise<string> {
const file = fs.openSync(filePath, fs.OpenMode.READ_ONLY);
const content = await fs.readText(filePath)
fs.closeSync(file.fd);
return content
}
// 删除文件
async removeFile(filePath: string) {
await fs.unlink(filePath); // 删除指定文件
}
//删除目录
async removeDir(dir: string) {
fs.rmdir(dir)
}
}
更多关于HarmonyOS 鸿蒙Next文件管理的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
// pages/xxx.ets
import { fileIo as fs, ReadOptions } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';
import { buffer } from '@kit.ArkTS';
// 请在组件内获取context,确保this.getUIContext().getHostContext()返回结果为UIAbilityContext
let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
function createFile(context: common.UIAbilityContext): void {
let filesDir = context.filesDir;
// 文件不存在时创建并打开文件,文件存在时打开文件
let file = fs.openSync(filesDir + '/test.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
// 写入一段内容至文件
let writeLen = fs.writeSync(file.fd, "Try to write str.");
console.info("The length of str is: " + writeLen);
// 创建一个大小为1024字节的ArrayBuffer对象,用于存储从文件中读取的数据
let arrayBuffer = new ArrayBuffer(1024);
// 设置读取的偏移量和长度
let readOptions: ReadOptions = {
offset: 0,
length: arrayBuffer.byteLength
};
// 读取文件内容到ArrayBuffer对象中,并返回实际读取的字节数
let readLen = fs.readSync(file.fd, arrayBuffer, readOptions);
// 将ArrayBuffer对象转换为Buffer对象,并转换为字符串输出
let buf = buffer.from(arrayBuffer, 0, readLen);
console.info("the content of file: " + buf.toString());
// 关闭文件
fs.closeSync(file);
}
参考地址
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/app-file-access
HarmonyOS Next的文件管理基于分布式软总线技术实现跨设备文件访问。系统提供统一的文件管理接口,支持安全沙箱隔离机制,应用通过FileManager API访问受限沙箱目录。分布式文件系统支持设备间安全共享,用户可通过统一入口查看多设备文件。文件操作采用权限管控模型,应用需声明存储权限。系统内置文件分类管理和智能推荐功能。
在HarmonyOS Next中,应用沙箱目录下的文件操作主要通过@ohos.file.fs(文件系统)和@ohos.file.path(路径管理)模块实现。以下是关键步骤和代码示例:
1. 获取应用沙箱目录路径
使用context获取应用文件目录,这是沙箱的起点。
import { context } from '@ohos.app.ability.common';
import fs from '@ohos.file.fs';
import path from '@ohos.file.path';
// 获取应用沙箱文件目录路径
let sandboxDir = context.filesDir; // 例如 /data/app/.../files
2. 创建指定名称的子目录
拼接目标子目录路径,并使用fs.mkdirSync()或异步方法创建目录。
// 定义子目录名称
let subDirName = 'mySubDir';
// 拼接完整路径
let targetDirPath = path.join(sandboxDir, subDirName);
// 同步创建目录(如果目录已存在会抛出异常,需用try-catch处理)
try {
fs.mkdirSync(targetDirPath);
console.log(`目录创建成功: ${targetDirPath}`);
} catch (err) {
console.error(`目录创建失败: ${err.code}, ${err.message}`);
}
// 或使用异步方式
fs.mkdir(targetDirPath).then(() => {
console.log('异步创建目录成功');
}).catch((err) => {
console.error(`异步创建失败: ${err.code}`);
});
3. 在子目录中创建文件
在目标目录下拼接文件路径,使用fs.openSync()或fs.createStream()创建文件。
let fileName = 'myFile.txt';
let filePath = path.join(targetDirPath, fileName);
// 同步创建并打开文件(flags: 0o100 表示创建文件,0o2 表示读写模式)
let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
console.log(`文件创建成功,fd: ${file.fd}`);
// 写入内容(可选)
let content = 'Hello HarmonyOS Next';
fs.writeSync(file.fd, content);
// 操作完成后关闭文件
fs.closeSync(file.fd);
4. 读取文件内容
使用fs.readSync()或fs.createStream()读取文件。
// 同步读取
let fileToRead = fs.openSync(filePath, fs.OpenMode.READ_ONLY);
let buffer = new ArrayBuffer(1024);
let readLen = fs.readSync(fileToRead.fd, buffer);
let fileContent = String.fromCharCode.apply(null, new Uint8Array(buffer.slice(0, readLen)));
console.log(`文件内容: ${fileContent}`);
fs.closeSync(fileToRead.fd);
5. 删除文件或目录
- 删除文件:使用
fs.unlinkSync()。fs.unlinkSync(filePath); // 删除文件 - 删除目录:使用
fs.rmdirSync()(目录需为空)。fs.rmdirSync(targetDirPath); // 删除空目录 - 递归删除非空目录:需先遍历删除目录内所有子项。
function deleteDirectory(dirPath) { let list = fs.listFileSync(dirPath); list.forEach(item => { let fullPath = path.join(dirPath, item); let stat = fs.statSync(fullPath); if (stat.isDirectory()) { deleteDirectory(fullPath); // 递归删除子目录 } else { fs.unlinkSync(fullPath); // 删除文件 } }); fs.rmdirSync(dirPath); // 删除空目录 }
关键注意事项:
- 权限声明:操作文件需在
module.json5中声明ohos.permission.FILE_ACCESS权限。 - 路径安全:使用
path.join()拼接路径,避免手动拼接导致的错误。 - 错误处理:所有同步方法需用
try-catch处理异常;异步操作需处理Promise异常。 - 资源释放:操作完成后及时调用
closeSync()或close()释放文件描述符。
以上方法适用于HarmonyOS Next API 11+版本,可直接在Stage模型应用中使用。

