指定したディレクトリ以下のファイルをコピーする
指定したでディレクトリ配下のファイルをコピーし、
コピー先にファイルがない場合にのみ出力を行うモジュールが
必要であったため自作したものを備忘録としてあげておきます。
また、取得する関数の紹介ばかりで、
同期処理など含めておらず実用的でない記事が多かったため、
この記事を書きました。
記事を読むために
- 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)
}
})
})
}
汎用的にしたつもりですので、
カスタムなどして利用してみてもいいかもしれません。