TS从目录中提取所有指定扩展名的文件

import path from 'path'
import fs from 'fs'

/**
 * 从指定目录中提取指定后缀名的所有文件
 * @param srcPath string 要提取文件的目录路径,相对或绝对路径都可
 * @param destPath string 提取后的文件存放的目录路径,相对或绝对路径都可
 * @param exts string[] 要提取的文件扩展名数组,每个扩展名需以点开头
 * @param filenameArr string[] 用来存放提取出的文件的原始路径的数组,可不传,默认为空数组
 * @return string[] 提取出的文件的原始路径数组
 */
function extractAllFiles(
  srcPath: string,
  destPath: string,
  exts: string[],
  filenameArr: string[] = []
): string[] {
  // 如果源目录不存在,直接结束程序
  if (!fs.existsSync(srcPath)) {
    console.log(`源目录不存在,请核对修改!`)
    return filenameArr
  }
  // 如果存放目录不存在,则创建
  !fs.existsSync(destPath) && fs.mkdirSync(destPath)

  // 获取src和dest的绝对路径
  const realSrc = fs.realpathSync(srcPath)
  const realDest = fs.realpathSync(destPath)

  // 遍历src,判断文件类型
  fs.readdirSync(realSrc).forEach(filename => {
    // 拼接文件的绝对路径
    const realFile = path.resolve(realSrc, filename)

    // 如果是目录,递归提取
    if (fs.statSync(realFile).isDirectory()) {
      extractAllFiles(realFile, realDest, exts, filenameArr)
    } else {
      // 如果是文件,则判断其扩展名是否在给定的扩展名数组中,在则将该文件复制到dest中
      if (exts.includes(path.extname(filename))) {
        // 考虑到不同目录的文件有可能重名,所以在复制时,使用时间戳来重命名文件,也可以使用nanoid
        fs.copyFileSync(realFile, path.resolve(realDest, Date.now() + '@' + filename))
        filenameArr.push(realFile)
      }
    }
  })
  return filenameArr
}
posted @ 2023-05-14 15:25  光影星宸  阅读(297)  评论(0)    收藏  举报