HarmonyOS 鸿蒙Next文件管理

HarmonyOS 鸿蒙Next文件管理 如何在应用的沙箱目录下创建指定名称的子目录

并在这个子目录下创建或者读取删除(一个或者多个)指定名称的子文件

4 回复

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模型应用中使用。

回到顶部