161847f8eSopenharmony_ci/*
261847f8eSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
361847f8eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
461847f8eSopenharmony_ci * you may not use this file except in compliance with the License.
561847f8eSopenharmony_ci * You may obtain a copy of the License at
661847f8eSopenharmony_ci *
761847f8eSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
861847f8eSopenharmony_ci *
961847f8eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1061847f8eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1161847f8eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1261847f8eSopenharmony_ci * See the License for the specific language governing permissions and
1361847f8eSopenharmony_ci * limitations under the License.
1461847f8eSopenharmony_ci */
1561847f8eSopenharmony_ci
1661847f8eSopenharmony_ciimport fs from 'fs';
1761847f8eSopenharmony_ciimport path from 'path';
1861847f8eSopenharmony_ciimport envConfig from '../config/env';
1961847f8eSopenharmony_ciimport { LogUtil } from './logUtil';
2061847f8eSopenharmony_ciimport { StringConstant } from '../utils/Constant';
2161847f8eSopenharmony_ciif (!process.env.DIR_NAME) {
2261847f8eSopenharmony_ci  Object.assign(process.env, envConfig);
2361847f8eSopenharmony_ci}
2461847f8eSopenharmony_ciexport class FileUtils {
2561847f8eSopenharmony_ci  /**
2661847f8eSopenharmony_ci   * 通过动态环境变量配置项目根目录的地址
2761847f8eSopenharmony_ci   */
2861847f8eSopenharmony_ci  private static baseDirName: string = String(process.env.DIR_NAME);
2961847f8eSopenharmony_ci  /**
3061847f8eSopenharmony_ci   * 获取项目根目录的地址,相关配置可以查看src\config\env.ts中的DIR_NAME配置
3161847f8eSopenharmony_ci   */
3261847f8eSopenharmony_ci  static getBaseDirName(): string {
3361847f8eSopenharmony_ci    return this.baseDirName;
3461847f8eSopenharmony_ci  }
3561847f8eSopenharmony_ci  /**
3661847f8eSopenharmony_ci   * 读取文件,返回满足要求的所有文件路径
3761847f8eSopenharmony_ci   *
3861847f8eSopenharmony_ci   * @param {string} dirName 文件目录
3961847f8eSopenharmony_ci   * @param {(name: string) => boolean} [filter] 文件路径的过滤条件
4061847f8eSopenharmony_ci   * @return {Array<string>}
4161847f8eSopenharmony_ci   */
4261847f8eSopenharmony_ci  static readFilesInDir(dirName: string, filter?: (name: string) => boolean): Array<string> {
4361847f8eSopenharmony_ci    const files: Array<string> = [];
4461847f8eSopenharmony_ci    if (!fs.existsSync(dirName)) {
4561847f8eSopenharmony_ci      return files;
4661847f8eSopenharmony_ci    }
4761847f8eSopenharmony_ci    fs.readdirSync(dirName, { withFileTypes: true }).forEach((dir) => {
4861847f8eSopenharmony_ci      if (dir.name === StringConstant.NOT_SCAN_DIR) {
4961847f8eSopenharmony_ci        return;
5061847f8eSopenharmony_ci      }
5161847f8eSopenharmony_ci      const filePath: string = path.join(dirName, dir.name);
5261847f8eSopenharmony_ci      if (dir.isFile()) {
5361847f8eSopenharmony_ci        if (!filter) {
5461847f8eSopenharmony_ci          files.push(filePath);
5561847f8eSopenharmony_ci          return;
5661847f8eSopenharmony_ci        }
5761847f8eSopenharmony_ci        if (filter(dir.name)) {
5861847f8eSopenharmony_ci          files.push(filePath);
5961847f8eSopenharmony_ci        }
6061847f8eSopenharmony_ci        return;
6161847f8eSopenharmony_ci      }
6261847f8eSopenharmony_ci      files.push(...FileUtils.readFilesInDir(filePath, filter));
6361847f8eSopenharmony_ci    });
6461847f8eSopenharmony_ci    return files;
6561847f8eSopenharmony_ci  }
6661847f8eSopenharmony_ci
6761847f8eSopenharmony_ci  static writeStringToFile(str: string, filePath: string): void {
6861847f8eSopenharmony_ci    const parentDir: string = path.dirname(filePath);
6961847f8eSopenharmony_ci    if (!FileUtils.isExists(parentDir)) {
7061847f8eSopenharmony_ci      fs.mkdirSync(parentDir, { recursive: true });
7161847f8eSopenharmony_ci    }
7261847f8eSopenharmony_ci    fs.writeFileSync(filePath, str);
7361847f8eSopenharmony_ci  }
7461847f8eSopenharmony_ci
7561847f8eSopenharmony_ci  static isDirectory(path: string): boolean {
7661847f8eSopenharmony_ci    const stats: fs.Stats = fs.lstatSync(path);
7761847f8eSopenharmony_ci    return stats.isDirectory();
7861847f8eSopenharmony_ci  }
7961847f8eSopenharmony_ci
8061847f8eSopenharmony_ci  static isFile(path: string): boolean {
8161847f8eSopenharmony_ci    const stats: fs.Stats = fs.lstatSync(path);
8261847f8eSopenharmony_ci    return stats.isFile();
8361847f8eSopenharmony_ci  }
8461847f8eSopenharmony_ci
8561847f8eSopenharmony_ci  static isExists(pathName: string | undefined): boolean {
8661847f8eSopenharmony_ci    if (!pathName) {
8761847f8eSopenharmony_ci      return false;
8861847f8eSopenharmony_ci    }
8961847f8eSopenharmony_ci    try {
9061847f8eSopenharmony_ci      fs.accessSync(path.resolve(this.baseDirName, pathName), fs.constants.R_OK);
9161847f8eSopenharmony_ci      return true;
9261847f8eSopenharmony_ci    } catch (exception) {
9361847f8eSopenharmony_ci      const error = exception as Error;
9461847f8eSopenharmony_ci      LogUtil.e(`error filePath`, error.stack ? error.stack : error.message);
9561847f8eSopenharmony_ci      return false;
9661847f8eSopenharmony_ci    }
9761847f8eSopenharmony_ci  }
9861847f8eSopenharmony_ci}
99