【鸿蒙在 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;
    }
  }
}
相关推荐
今儿敲了吗4 小时前
鸿蒙开发第一章学习笔记
笔记·学习·鸿蒙
_waylau6 小时前
【HarmonyOS NEXT+AI】问答08:仓颉编程语言是中文编程语言吗?
人工智能·华为·harmonyos·鸿蒙·仓颉编程语言·鸿蒙生态·鸿蒙6
晚霞的不甘12 小时前
Flutter for OpenHarmony 实现高级视差侧滑菜单:融合动效、模糊与交互动画的现代 UI 设计
flutter·ui·前端框架·交互·鸿蒙
阿钱真强道18 小时前
10 jetlinks-mqtt-直连设备-属性-读取-返回
linux·服务器·网络·鸿蒙
ITUnicorn2 天前
【HarmonyOS6】从零实现自定义计时器:掌握TextTimer组件与计时控制
华为·harmonyos·arkts·鸿蒙·harmonyos6
晚霞的不甘2 天前
Flutter for OpenHarmony从基础到专业:深度解析新版番茄钟的倒计时优化
android·flutter·ui·正则表达式·前端框架·鸿蒙
向哆哆2 天前
Flutter × OpenHarmony 跨端实战:打造健身俱乐部「数据可视化仪表盘」模块
flutter·信息可视化·开源·鸿蒙·openharmony·开源鸿蒙
小哥Mark2 天前
使用Flutter导航组件TabBar、AppBar等为鸿蒙应用程序构建完整的应用导航体系
flutter·harmonyos·鸿蒙
向哆哆2 天前
打造高校四六级报名管理系统:基于 Flutter × OpenHarmony 的跨端开发实践
flutter·开源·鸿蒙·openharmony·开源鸿蒙
向哆哆2 天前
构建跨端健身俱乐部管理系统:Flutter × OpenHarmony 的数据结构与设计解析
数据结构·flutter·鸿蒙·openharmony·开源鸿蒙