鸿蒙文件操作
@ohos.file.fs (文件管理)
简介
@ohos.file.fs (文件管理) 模块是鸿蒙系统(HarmonyOS)中用于处理文件操作的核心基础能力,提供文件/目录管理、信息统计、流式读写等功能。以下是支持的基础能力:
- 文件/目录管理(创建、删除、重命名)
- 文件信息统计(大小、修改时间等)
- 流式读写操作
- 路径访问控制
初始设置与路径获取
在开始文件操作前,需要先导入模块并获取应用的沙箱路径,这是文件操作的起点,也能保证数据的安全性和隔离性。
-
导入模块:
import fs from '@ohos.file.fs';
-
获取沙箱路径 (Stage模型示例):
import UIAbility from '@ohos.app.ability.UIAbility'; import window from '@ohos.window';export default class EntryAbility extends UIAbility {onWindowStageCreate(windowStage: window.WindowStage) {let context = this.context;let pathDir = context.filesDir; // 这就是你的应用沙箱目录路径} }
核心文件操作API介绍
列举了 @ohos.file.fs 模块中一些最常用的接口,方便你快速了解其功能范围(@ohos.file.fs API官方指南):
| 功能分类 | 接口名称 | 主要作用 |
|---|---|---|
| 文件信息 | fs.stat(), fs.statSync() | 获取文件或目录的详细信息,例如文件大小。 |
| 存在性检查 | fs.access(), fs.accessSync() | 检查指定路径的文件是否存在。 |
| 文件读写 | fs.open(), fs.openSync() | 打开文件,获取文件对象(File)。 |
fs.read(), fs.readSync() | 从文件中读取数据。 | |
fs.write(), fs.writeSync() | 向文件中写入数据。 | |
fs.close(), fs.closeSync() | 关闭文件,释放资源。 | |
| 流式操作 | fs.createStream(), fs.createStreamSync() | 创建文件流,适用于大文件。 |
stream.read(), stream.write() | 通过流进行文件读写。 | |
stream.close() | 关闭文件流。 | |
| 目录管理 | fs.mkdir(), fs.mkdirSync() | 创建目录。 |
fs.listFile(), fs.listFileSync() | 列出目录下的所有文件和子目录。 | |
| 文件管理 | fs.copyFile(), fs.copyFileSync() | 复制文件。 |
fs.moveFile(), fs.moveFileSync() | 移动文件。 | |
fs.rename(), fs.renameSync() | 重命名文件或目录。 | |
fs.unlink(), fs.unlinkSync() | 删除单个文件。 | |
fs.rmdir(), fs.rmdirSync() | 删除整个空目录。 |
常用操作代码示例
获取文件信息
获取文件信息(异步 Promise)
import { BusinessError } from '@kit.BasicServicesKit';
import { fileIo as fs } from '@kit.CoreFileKit';let filePath = filesDir + '/test.txt'; // 应用沙箱路径// 异步获取文件属性
fs.stat(filePath).then((stat: fs.Stat) => {console.info("文件大小: " + stat.size);
}).catch((err: BusinessError) => {console.error("错误码: " + err.code + ", 错误信息: " + err.message);
});
同步获取文件信息
let stat = fs.statSync(filePath);
console.info("文件大小: " + stat.size);
检查文件是否存在
let filePath = pathDir + '/test.txt';
try {let exists = fs.accessSync(filePath);console.info(`File exists: ${exists}`);
} catch (err) {console.error(`Check file failed: ${err.code}, ${err.message}`);
}
创建并读写文件
// 同步方式创建并读写文件
let file = fs.openSync(pathDir + '/test.txt', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
// 写入内容
let writeLen = fs.writeSync(file.fd, "Hello, HarmonyOS!");
console.info(`Write length: ${writeLen}`);
// 读取内容
let arrayBuffer = new ArrayBuffer(1024);
let readOption = { offset: 0, length: arrayBuffer.byteLength };
let readLen = fs.readSync(file.fd, arrayBuffer, readOption);
let content = new Uint8Array(arrayBuffer, 0, readLen);
console.info(`File content: ${String.fromCharCode.apply(null, content)}`);
// 关闭文件
fs.closeSync(file);
以流的形式读写文件
async function readWriteFileWithStream() {let inputStream = fs.createStreamSync(pathDir + '/source.txt', 'r+');let outputStream = fs.createStreamSync(pathDir + '/destination.txt', "w+");let bufSize = 4096;let readSize = 0;let buf = new ArrayBuffer(bufSize);let readOption = { offset: readSize, length: bufSize };let readLen = await inputStream.read(buf, readOption);while (readLen > 0) {readSize += readLen;await outputStream.write(buf);readOption.offset = readSize;readLen = await inputStream.read(buf, readOption);}inputStream.closeSync();outputStream.closeSync();
}
将文件路径转换为文件对象
async function getFileObject(filePath: string) {try {// 以只读模式打开文件,获取File对象let file = await fs.open(filePath, fs.OpenMode.READ_ONLY);console.info('File object obtained');// ... 可以使用file进行后续操作,如读取// 操作完毕后,记得关闭文件fs.closeSync(file);} catch (error) {console.error(`Open file failed: ${error.code}, ${error.message}`);}
}
重要注意事项
-
权限申请:如果需要进行文件操作,请记得在
module.json5文件中配置必要的权限,例如ohos.permission.READ_MEDIA和ohos.permission.WRITE_MEDIA。 -
资源释放:无论是文件 (
fd) 还是文件流 (stream),在使用完毕后,务必记得调用相应的close方法来释放系统资源,避免内存泄漏。 -
错误处理:在进行文件操作时,使用
try...catch妥善处理可能出现的异常是个好习惯。 -
沙箱路径:为了保证应用数据的安全和符合系统规范,普通应用的文件操作应限制在应用沙箱路径内。
