【鸿蒙在 ETS (Extendable TypeScript) 中创建多级目录或文件,可以使用鸿蒙的文件系统 API】

鸿蒙在 ETS (Extendable TypeScript) 中创建多级目录或文件,可以使用鸿蒙的文件系统 API。

c 复制代码
// 导入需要的模块
import fs from '@ohos.file.fs';

const TAG="Index"
@Entry
@Component
struct Index {
  @State message: string = 'Hello World';

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)

        Button("创建目录")
          .margin({ top: 10 })
          .onClick(() => {
            // 调用示例
            this.createDirsByRelativePath('path/to/your/dir');
          })

        Button("创建文件")
          .margin({ top: 10 })
          .onClick(() => {
            // 调用示例
            this.createFile('path/to/your/dir/a.txt');
          })
      }
      .width('100%')
    }
    .height('100%')
  }

  /**
   * 创建文件
   * @param featurePath
   */
  async createFile(featurePath:string){
    let mFeaturePath = "";
    if (featurePath.indexOf("/") != -1) {
      //创建目录
      let lastAIndex = featurePath.lastIndexOf('/');
      let fFileDir: string = featurePath.slice(0, lastAIndex);
      let fileName: string = featurePath.slice(lastAIndex + 1);
      console.info(TAG, "arrPath:" + fFileDir);
        if (fFileDir.length != 0) {
          await this.createDirsByRelativePath(fFileDir);
          mFeaturePath = getContext(this).filesDir + fFileDir + "/" + fileName;
        } else {
          mFeaturePath = getContext(this).filesDir + "/" + fileName;
        }
      
    } else {
        mFeaturePath = getContext(this).filesDir + "/" + featurePath;
    }
    console.info(TAG, "mFeaturePath:" + mFeaturePath);
  }

  // 递归创建目录
  async createMultiDirs(dirPath: string): Promise<void> {
    try {
      // 先检查目录是否存在
      let isExist = await fs.access(dirPath);
      if (isExist) {
        console.info(`Directory already exists: ${dirPath}`);
        return;
      }
    } catch (err) {
      // 如果目录不存在,则继续创建
    }
    // 获取父目录
    const parentDir = dirPath.substring(0, dirPath.lastIndexOf('/'));
    // 如果父目录不是根目录,且父目录不存在,则递归创建父目录
    if (parentDir && parentDir !== '/' && parentDir !== '') {
      try {
        // 检查父目录是否存在,如果不存在则递归创建
        await this.createMultiDirs(parentDir);
      } catch (err) {
        console.error(`Failed to create parent directory: ${parentDir}, error: ${JSON.stringify(err)}`);
      }
    }
    // 创建当前目录
    try {
      await fs.mkdir(dirPath);
      console.info(`Directory created: ${dirPath}`);
    } catch (err) {
      // 如果错误码为13900015(文件已存在),则忽略,否则抛出错误
      if (err.code !== 13900015) {
        console.error(`Failed to create directory: ${dirPath}, error: ${JSON.stringify(err)}`);
      }
    }
  }

  // 创建相对路径的多级目录(入口函数)
  async createDirsByRelativePath(relativePath: string): Promise<void> {
    const context = getContext();
    const baseDir = context.filesDir;
    const targetDir = baseDir + '/' + relativePath;
    try {
      await this.createMultiDirs(targetDir);
      console.info('All directories created successfully.');
    } catch (err) {
      console.error(`Failed to create directories: ${JSON.stringify(err)}`);
    }
  }

  // 创建多级目录
  async createDirs(basePath: string, relativePath: string): Promise<boolean> {
    const fullPath = basePath + '/' + relativePath;

    try {
      await fs.mkdir(fullPath);
      console.info(`目录创建成功: ${fullPath}`);
      return true;
    } catch (error) {
      console.error(`目录创建失败: ${JSON.stringify(error)}`);
      return false;
    }
  }

  // 创建文件(带路径自动创建)
  async createFileWithPath(basePath: string, filePath: string, content: string = ''): Promise<boolean> {
    const fullPath = basePath + '/' + filePath;

    try {
      // 分离目录路径和文件名
      const lastSlashIndex = filePath.lastIndexOf('/');
      const dirPath = lastSlashIndex > 0 ? filePath.substring(0, lastSlashIndex) : '';

      // 创建目录(如果目录路径存在)
      if (dirPath) {
        await this.createDirs(basePath, dirPath);
      }
      // 创建文件并写入内容
      const file = await fs.open(fullPath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
      if (content) {
        await fs.write(file.fd, content);
      }
      await fs.close(file.fd);
      console.info(`文件创建成功: ${fullPath}`);
      return true;
    } catch (error) {
      console.error(`文件创建失败: ${JSON.stringify(error)}`);
      return false;
    }
  }

  // 检查文件是否存在
  async fileExists(basePath: string, filePath: string): Promise<boolean> {
    const fullPath = basePath + '/' + filePath;

    try {
      await fs.access(fullPath);
      return true;
    } catch {
      return false;
    }
  }
}
相关推荐
遇到困难睡大觉哈哈1 天前
Harmonny os——《从 TypeScript 到 ArkTS 的适配规则》精简笔记
笔记·typescript·harmonyos·鸿蒙
IT从业者张某某1 天前
DAY1-Open Harmony PC 命令行适配指南(Windows版)环境准备篇
harmonyos·鸿蒙
SuperHeroWu73 天前
【HarmonyOS 6】UIAbility跨设备连接详解(分布式软总线运用)
分布式·华为·harmonyos·鸿蒙·连接·分布式协同·跨设备链接
G_dou_4 天前
KMP & OpenHarmony 实现二分查找
kotlin·鸿蒙
hashiqimiya9 天前
理解更深的鸿蒙的嵌套属性和@State装饰器,引用是更改了吗?深层拷贝。
鸿蒙
A懿轩A10 天前
【OpenHarmony】跨平台开发鸿蒙Harmony项目框架选择建议
华为·鸿蒙·openharmony·开源鸿蒙
穆雄雄11 天前
sd 适配 OpenHarmony构建指南
鸿蒙
一只栖枝11 天前
HarmonyOS 开发高级认证是什么?含金量高吗?
华为·华为认证·harmonyos·鸿蒙·考证
汉堡黄•᷄ࡇ•᷅11 天前
鸿蒙开发:应用通知栏基本操作
鸿蒙·鸿蒙系统