UNPKG

nomi-cli

Version:

为node框架nomi打造的cli工具

215 lines (201 loc) 5.07 kB
'use strict'; /** * @description 封装文件操作 * @author weiguo.kong */ const fs = require('fs'); const path = require('path'); const { isArray, isString } = require('lodash'); /** * 校验文件路径 是否有效 * @param {*} vPath * @param {*} cb */ const validateFile = (vPath, cb) => { fs.stat(vPath, (err, stat) => { if (!stat) { console.log(stat) console.log(`文件${path.basename(vPath)}未定义!`); return; } if (!stat.isFile()) { console.log(`${path.basename(vPath)} 不是一个文件!`); return; } cb && cb(err, stat); }); } /** * 创建读取流 * @param {*} srcFile * @param {*} cb */ const createRS = (srcFile, cb, options) => { const rs = fs.createReadStream(srcFile, options); rs.on('error', err => { cb && cb(err); }); return rs; } /** * 创建写入流 * @param {*} tarFile * @param {*} cb */ const createWS = (tarFile, cb, options) => { const ws = fs.createWriteStream(tarFile, options); ws.on('error', err => { cb && cb(err); }) ws.on('close', ex => { cb && cb(ex); }); ws.on('open', ex => { cb && cb(ex); }) return ws; } /** * copy file: 将srcFile文件 copy 至 tarFile * @param {*} srcFile * @param {*} tarFile * @param {*} cb */ const copyFile = (srcFile, tarFile, cb) => { const rs = createRS(srcFile, cb); const ws = createWS(tarFile, cb); rs.pipe(ws); } /** * 递归创建目录: 异步 * @param {string | Array} dirname eg: 'foo/dre/cof/fd/' ['foo/fdf', 'ffa/fds'] * @param {fun} callback */ const mkdirsFunc = (dirname, callback) => { if (isString(dirname)) { dirname = [dirname]; } if (!isArray(dirname)) { return; } dirname.forEach(dir => { fs.exists(dir, exists => { if (exists) { callback && callback(); } else { mkdirsFunc(path.dirname(dir), () => { fs.mkdir(dir, callback); }); } }); }); } /** * 递归创建目录: 异步 * @param {string} prefix * @param {string | Array} dirname eg: 'foo/dre/cof/fd/' ['foo/fdf', 'ffa/fds'] * @param {fun} callback */ const mkdirs = (dirname, callback, prefix) => { if (!prefix) { mkdirsFunc(dirname, callback); return; } if (isString(dirname)) { dirname = [dirname]; } if (!isArray(dirname)) { return; } mkdirsFunc(dirname.map(dir => { return path.resolve(prefix, dir); }), callback); } /** * 同步: 递归创建目录 * @param {*} dirname */ const mkdirsSync = dirname => { if (fs.existsSync(dirname)) { return true; } else { if (mkdirsSync(path.dirname(dirname))) { fs.mkdirSync(dirname); return true; } } } /** * copy 目录下所有子目录 以及文件 * @param {*} srcDir * @param {*} tarDir * @param {*} cb */ const copyFolder = (srcDir, tarDir, cb) => { fs.readdir(srcDir, (err, files) => { let count = 0; const checkEnd = () => { ++count == files.length && cb && cb(); } if (err) { checkEnd(); return } files.forEach(file => { let srcFile = path.join(srcDir, file); let tarFile = path.join(tarDir, file); fs.stat(srcFile, (err, stats) => { if (stats.isDirectory()) { fs.mkdir(tarFile, err => { if (err) { return; } copyFolder(srcFile, tarFile, checkEnd); //递归copy目录 }); } else if(stats.isFile()) { copyFile(srcFile, tarFile, checkEnd); // copy文件 } }); }); files.length === 0 && cb && cb(); }); }; /** * 根据path 创建文件,并复制data内容写入文件 * @param {*} path * @param {*} data * @param {*} cb */ const writeFile = (path, data, cb) => { //fs.createWriteStream(path); //根据路径创建文件 createWS(path, () => { fs.stat(path, (err, stats) => { if (!stats) { console.log(`文件路径错误,文件写入失败!`) return; } if (stats.isFile()) { fs.writeFile(path, data, 'utf8', () => { //写入数据 cb && cb(); }); } }); }); }; const readFile = (filePath, cb, options) => { validateFile(filePath, () => { options = options || 'utf8'; fs.readFile(filePath, options, (err, data) => {cb && cb(data)}); }); } module.exports = { copyFolder, copyFile, createRS, createWS, mkdirs, mkdirsSync, writeFile, validateFile, readFile }