// import path from 'path'
// import fs from 'fs'
import get from 'lodash-es/get.js'
import isbol from './isbol.mjs'
import fsIsFileCore from './fsIsFileCore.mjs'
import fsCreateFolderCore from './fsCreateFolderCore.mjs'
function fsCopyFileSyncCore(fpSrc, fpTar, opt = {}) {
//path, fs
let path = get(opt, 'path')
let fs = get(opt, 'fs')
//check
if (!fsIsFileCore(fpSrc, { fs })) {
return {
error: `fpSrc[${fpSrc}] is not a file`
}
}
//複製檔案
try {
//fsCreateFolderCore
fsCreateFolderCore(path.dirname(fpTar), { fs })
//copyFileSync
fs.copyFileSync(fpSrc, fpTar)
}
catch (err) {
return {
error: err
}
}
return {
success: 'done: ' + fpTar
}
}
async function fsCopyFileCoreAsync(fpSrc, fpTar, opt = {}) {
//path, fs
let path = get(opt, 'path')
let fs = get(opt, 'fs')
//check
if (!fsIsFileCore(fpSrc, { fs })) {
return {
error: `fpSrc[${fpSrc}] is not a file`
}
}
//fsCopyFileCoreAsyncCore
let fsCopyFileCoreAsyncCore = async (fpSrc, fpTar) => {
//fsCreateFolderCore
fsCreateFolderCore(path.dirname(fpTar), { fs })
//使用串流方式複製檔案
await new Promise((resolve, reject) => {
//streamRead, streanWrite
let streamRead = fs.createReadStream(fpSrc)
let streanWrite = fs.createWriteStream(fpTar)
//on
streamRead.on('error', reject)
streanWrite.on('error', reject)
streanWrite.on('finish', resolve)
//pipe
streamRead.pipe(streanWrite)
})
}
//fsCopyFileCoreAsyncCore
let r = null
await fsCopyFileCoreAsyncCore(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/fsCopyFileCore.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 fsCopyFile
*
*/
function fsCopyFileCore(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 = fsCopyFileSyncCore(fpSrc, fpTar, { path, fs })
}
else {
r = fsCopyFileCoreAsync(fpSrc, fpTar, { path, fs })
}
return r
}
export default fsCopyFileCore