【鸿蒙在 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;
    }
  }
}
相关推荐
●VON16 分钟前
鸿蒙 PC Markdown 编辑器通信架构:受限 ArkTS-JavaScript Bridge
华为·架构·编辑器·harmonyos·鸿蒙
一缕清烟在人间38 分钟前
HarmonyOS开发实战:小分享-TextEditPage文字编辑器——Header+TextArea+工具栏
后端·华为·harmonyos·鸿蒙
2501_918582371 小时前
HarmonyOS应用开发实战:小事记 - 应用包结构:HAP/HSP/HAR 的三层架构与 deliveryWithInstall 策略
华为·架构·harmonyos·鸿蒙
●VON2 小时前
鸿蒙 PC Markdown 编辑器自由窗口:覆盖侧栏与响应式预算
安全·华为·编辑器·harmonyos·鸿蒙
●VON4 小时前
鸿蒙 PC Markdown 编辑器有界版本历史:沙箱快照、完整性校验与安全恢复
安全·华为·编辑器·harmonyos·鸿蒙
爱写代码的阿森16 小时前
鸿蒙三方库 | harmony-utils之KvUtil键值型数据库操作详解
数据库·华为·harmonyos·鸿蒙·huawei
LEO1111016 小时前
HarmonyOS开发实战:小分享-BottomTabBar自定义底部导航栏组件
后端·华为·harmonyos·鸿蒙
爱写代码的阿森18 小时前
鸿蒙三方库 | harmony-utils之PreferencesUtil用户首选项读写详解
华为·harmonyos·鸿蒙·huawei
爱写代码的阿森19 小时前
鸿蒙三方库 | harmony-utils之PreferencesUtil首选项数据监听详解
服务器·华为·harmonyos·鸿蒙·huawei
爱写代码的森19 小时前
蒙三方库 | harmony-utils之FileUtil文件重命名与属性查询详解
linux·运维·服务器·华为·harmonyos·鸿蒙·huawei