fsCopyFolder.mjs

import path from 'path'
import fs from 'fs'
import fsCreateFolder from './fsCreateFolder.mjs'


/**
 * 後端nodejs複製資料夾
 *
 * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/fsCopyFolder.test.mjs Github}
 * @memberOf wsemi
 * @param {String} fpSrc 輸入來源資料夾路徑字串
 * @param {String} fpTar 輸入目的資料夾路徑字串
 * @example
 * need test in nodejs.
 *
 * import fs from 'fs'
 * import fsCreateFolder from './src/fsCreateFolder.mjs'
 * import fsCleanFolder from './src/fsCleanFolder.mjs'
 * import fsDeleteFolder from './src/fsDeleteFolder.mjs'
 * import fsCopyFolder from './src/fsCopyFolder.mjs'
 *
 * console.log('fsCreateFolder', fsCreateFolder('./d/dd/ddd'))
 *
 * fs.writeFileSync('./d/a.txt', 'd-a', 'utf8')
 * fs.writeFileSync('./d/dd/b.txt', 'd-b', 'utf8')
 * fs.writeFileSync('./d/dd/ddd/c.txt', 'd-c', 'utf8')
 *
 * console.log('fsCleanFolder', fsCleanFolder('./d'))
 *
 * console.log('fsCreateFolder 1', fsCreateFolder('./d/ee/eee'))
 *
 * fs.writeFileSync('./d/a.txt', 'e-a', 'utf8')
 * fs.writeFileSync('./d/ee/b.txt', 'e-b', 'utf8')
 * fs.writeFileSync('./d/ee/eee/c.txt', 'e-c', 'utf8')
 *
 * console.log('fsDeleteFolder', fsDeleteFolder('./d'))
 *
 * console.log('fsCreateFolder 2', fsCreateFolder('./d/ff/fff'))
 *
 * fs.writeFileSync('./d/a.txt', 'f-a', 'utf8')
 * fs.writeFileSync('./d/ff/b.txt', 'f-b', 'utf8')
 * fs.writeFileSync('./d/ff/fff/c.txt', 'f-c', 'utf8')
 *
 * console.log('fsCopyFolder', fsCopyFolder('./d', './e'))
 *
 * // fsCreateFolder { success: 'done: ./d/dd/ddd' }
 * // fsCleanFolder { success: 'done: ./d' }
 * // fsCreateFolder 1 { success: 'done: ./d/ee/eee' }
 * // fsDeleteFolder { success: 'done: ./d' }
 * // fsCreateFolder 2 { success: 'done: ./d/ff/fff' }
 * // fsCopyFolder { success: 'done: ./e' }
 */
function fsCopyFolder(fpSrc, fpTar) {

    //複製資料夾
    try {

        fs.readdirSync(fpSrc).forEach(function(file) {

            //fpSrcTemp, fpTarTemp
            let fpSrcTemp = fpSrc + '/' + file
            let fpTarTemp = fpTar + '/' + file

            //current
            let current = fs.lstatSync(fpSrcTemp)

            //proc
            if (current.isDirectory()) {

                //fsCreateFolder
                fsCreateFolder(path.dirname(fpTarTemp))

                //fsCopyFolder
                fsCopyFolder(fpSrcTemp, fpTarTemp)

            }
            else if (current.isSymbolicLink()) {

                //symlinkSync
                let symlink = fs.readlinkSync(fpSrcTemp)
                fs.symlinkSync(symlink, fpTarTemp)

            }
            else {

                //fsCreateFolder
                fsCreateFolder(path.dirname(fpTarTemp))

                //copyFileSync
                fs.copyFileSync(fpSrcTemp, fpTarTemp)

            }

        })

    }
    catch (err) {
        return {
            error: err
        }
    }

    return {
        success: 'done: ' + fpTar
    }
}


export default fsCopyFolder