@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);

遍历文件目录

try {
    let files = fs.listFileSync(dirPath);
    files.forEach((item) => {
        if (item.includes(".jpeg")) {
            fs.unlink(dirPath + "/" + item, (err) => {
                if (err) {
                    Logger.i(TAG, `文件${item}删除失败`);
                } else {
                    Logger.i(TAG, `文件${item}删除成功`);
                }
            });
        }
    })
} catch (error) {
    Logger.e(TAG, `deleteAllJpeg failed, error:${JSON.stringify(error)}`)
}

检查文件是否存在

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}`);
// 读取内容
const fileInfo = fs.statSync(filePath);//获取文件或目录的详细信息,例如文件大小。
let arrayBuffer = new ArrayBuffer(fileInfo.size);
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}`);
  }
}

删除文件

import fs from '@ohos.file.fs';

fs.unlink(filePath).catch(() => {
    Logger.e(TAG, `delete file failed, path:${filePath}`)
})

重要注意事项

  • 权限申请:如果需要进行文件操作,请记得在 module.json5 文件中配置必要的权限,例如 ohos.permission.READ_MEDIA 和 ohos.permission.WRITE_MEDIA

  • 资源释放:无论是文件 (fd) 还是文件流 (stream),在使用完毕后,务必记得调用相应的 close 方法来释放系统资源,避免内存泄漏。

  • 错误处理:在进行文件操作时,使用 try...catch 妥善处理可能出现的异常是个好习惯。

  • 沙箱路径:为了保证应用数据的安全和符合系统规范,普通应用的文件操作应限制在应用沙箱路径内。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐