【Node.js】指定したディレクトリ以下のファイル群をコピーする


指定したディレクトリ以下のファイルをコピーする

指定したでディレクトリ配下のファイルをコピーし、
コピー先にファイルがない場合にのみ出力を行うモジュールが
必要であったため自作したものを備忘録としてあげておきます。

また、取得する関数の紹介ばかりで、
同期処理など含めておらず実用的でない記事が多かったため、
この記事を書きました。

記事を読むために

  • node npm の環境構築が可能
  • ES6 が理解できる
  • async await (同期処理/非同期処理)を理解できる

コード

まずfsモジュールのreaddirSync()を用いて該当ディレクトリ配下にある、
ディレクトリ、またはファイル名を取得する処理を書いていきます。
readdir():非同期処理
readdirSync(): 同期処理
これらを用いることで引数に渡したディレクトリ配下の
ディレクトリ名やファイル名を取得することができます。

関数の処理が非同期であると戻り値が担保されないため、
async awaitとthen()を利用します。

import fs from 'fs'

const getFileNameList = async (originFilePath) => {
  // fileListがreturnされるまで待機
  return await fs.readdirSync(originFilePath, (err, fileList) => {
     if (err) throw err
     return fileList
  })
}

次にfsモジュールのcopyFileSync()を利用し、
取得したファイル群を指定したディレクトリ配下にコピーしていきます。

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

const copyFilesToDir = (originDir, copyDir) => {
  getFileNameList(path.resolve(originDir) + '/')
  .then(list => { // 処理完了後に処理を実行し戻り値を担保
    const fileNameList = list.slice()
    fileNameList.forEach((fileName) => {
      try {
        // fs.constants.COPYFILE_EXCLをオプションに設定
        // コピー先に同名ファイルが存在した場合に例外を出す
        // 指定しない場合は上書き
        fs.copyFileSync(
          path.resolve(copyDir + fileName), 
          path.resolve(originDir + fileName), 
          fs.constants.COPYFILE_EXCL
        )
        console.log('copied:' + path.resolve(originDir + fileName))
      } catch(err) {
        // ファイルがすでに存在する場合 EEXIST
        // ディレクトリが存在しない場合 ENOENT
        console.log(err)
      }
    })
  })
}

汎用的にしたつもりですので、
カスタムなどして利用してみてもいいかもしれません。