UNPKG

wsemi

Version:

A support package for web developer.

215 lines (159 loc) 5.66 kB
// import path from 'path' // import fs from 'fs' import get from 'lodash-es/get.js' import isbol from './isbol.mjs' import fsIsFolderCore from './fsIsFolderCore.mjs' import fsCreateFolderCore from './fsCreateFolderCore.mjs' function fsCopyFolderCoreSync(fpSrc, fpTar, opt = {}) { //path, fs let path = get(opt, 'path') let fs = get(opt, 'fs') //check if (!fsIsFolderCore(fpSrc, { fs })) { return { error: `fpSrc[${fpSrc}] is not a folder` } } //複製資料夾 try { fs.readdirSync(fpSrc).forEach(function(file) { //fpSrcTemp, fpTarTemp let fpSrcTemp = path.resolve(fpSrc, file) let fpTarTemp = path.resolve(fpTar, file) //current let current = fs.lstatSync(fpSrcTemp) //proc if (current.isDirectory()) { //fsCreateFolderCore fsCreateFolderCore(fpTarTemp, { fs }) //fsCopyFolderCoreSync fsCopyFolderCoreSync(fpSrcTemp, fpTarTemp, { path, fs }) } else if (current.isSymbolicLink()) { //symlinkSync let symlink = fs.readlinkSync(fpSrcTemp) fs.symlinkSync(symlink, fpTarTemp) } else { //fsCreateFolderCore fsCreateFolderCore(path.dirname(fpTarTemp), { fs }) //copyFileSync fs.copyFileSync(fpSrcTemp, fpTarTemp) } }) } catch (err) { return { error: err } } return { success: 'done: ' + fpTar } } async function fsCopyFolderCoreAsync(fpSrc, fpTar, opt = {}) { //path, fs let path = get(opt, 'path') let fs = get(opt, 'fs') //check if (!fsIsFolderCore(fpSrc, { fs })) { return { error: `fpSrc[${fpSrc}] is not a folder` } } //fsCopyFolderCoreAsyncCore let fsCopyFolderCoreAsyncCore = async (fpSrc, fpTar) => { //讀取來源資料夾內容 let entries = fs.readdirSync(fpSrc) // console.log('entries', entries) for (let entry of entries) { // console.log('entry', entry) //fpSrcTemp let fpSrcTemp = path.join(fpSrc, entry) // console.log('fpSrcTemp', fpSrcTemp) //fpTarTemp let fpTarTemp = path.join(fpTar, entry) // console.log('fpTarTemp', fpTarTemp) //current let current = fs.lstatSync(fpSrcTemp) // console.log('current', current) //遍歷 if (current.isDirectory()) { //fsCreateFolderCore fsCreateFolderCore(fpTarTemp, { fs }) //fsCopyFolderCoreAsyncCore, 遞迴複製子資料夾 await fsCopyFolderCoreAsyncCore(fpSrcTemp, fpTarTemp) } else if (current.isSymbolicLink()) { //symlinkSync let symlink = fs.readlinkSync(fpSrcTemp) fs.symlinkSync(symlink, fpTarTemp) } else { //fsCreateFolderCore fsCreateFolderCore(path.dirname(fpTarTemp), { fs }) //使用串流方式複製檔案 await new Promise((resolve, reject) => { //streamRead, streanWrite let streamRead = fs.createReadStream(fpSrcTemp) let streanWrite = fs.createWriteStream(fpTarTemp) //on streamRead.on('error', reject) streanWrite.on('error', reject) streanWrite.on('finish', resolve) //pipe streamRead.pipe(streanWrite) }) } } } //fsCopyFolderCoreAsyncCore let r = null await fsCopyFolderCoreAsyncCore(fpSrc, fpTar) .then(() => { r = { success: 'done: ' + fpTar } }) .catch((err) => { r = { error: err } }) return r } /** * 後端nodejs複製資料夾 * * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/fsCopyFolderCore.test.mjs Github} * @memberOf wsemi * @param {String} fpSrc 輸入來源資料夾路徑字串 * @param {String} fpTar 輸入目的資料夾路徑字串 * @param {Object} [opt={}] 輸入設定物件,預設{} * @param {Boolean} [opt.useSync=true] 輸入是否使用同步函數布林值,預設true * @returns {Object|Promise} 若useSync=true回傳結果物件,提供鍵success代表成功訊息,提供鍵error代表錯誤訊息,若useSync=false則回傳Promise,resolve回傳結果物件,提供鍵success代表成功訊息,提供鍵error代表錯誤訊息,不觸發reject * @example * need test in nodejs. * * //see fsCopyFolder * */ function fsCopyFolderCore(fpSrc, fpTar, opt = {}) { //path, fs let path = get(opt, 'path') let fs = get(opt, 'fs') //useSync let useSync = get(opt, 'useSync', '') if (!isbol(useSync)) { useSync = true } let r = '' if (useSync) { r = fsCopyFolderCoreSync(fpSrc, fpTar, { path, fs }) } else { r = fsCopyFolderCoreAsync(fpSrc, fpTar, { path, fs }) } return r } export default fsCopyFolderCore