UNPKG

fofstudio-mcpservererp

Version:

fofstudio

522 lines (516 loc) 12.4 kB
const fs = require('fs'); const path = require('path'); const exec = require('child_process').exec let ifFile = true; exports.getAppPath = () => { if (ifFile == false) { return; } let path = __dirname; path = path.replaceAll("\\", "/"); const lastIndex = path.lastIndexOf('/modules'); if (lastIndex !== -1) { const beforeModules = path.slice(0, lastIndex); const afterModules = '/DataHtml'; path = beforeModules + afterModules; } return path; } exports.getDesktop = () => { if (ifFile == false) { return; } if (process.platform == 'darwin') { return process.env.HOME + "/Desktop" } if (process.platform == 'linux') { return process.env.HOME } let path_ = process.env.USERPROFILE + "/Desktop" path_ = path_.replaceAll("\\", "/") return path_; } exports.getPathAll = () => { if (ifFile == false) { return; } return process.env } /** * 遍历文件夹所有文件 * @dirPath 文件夹路径 * @mode 0(默认)=按级输出,1=所有文件输出到同一级 * @pathMode 0(默认)=绝对路径,1=仅文件名 */ exports.listFile = async (dirPath, funEv = undefined) => { if (ifFile == false) { return; } try { listFile_(dirPath).then(res => { if (funEv != undefined) { let PathArr = output(res, 0) for (let index = 0; index < PathArr.length; index++) { PathArr[index] = PathArr[index].replace("-- ", "") } funEv(PathArr); } }); } catch (err) { if (funEv != undefined) { funEv([]); } } } // 监视指定目录中的文件变化 exports.watch = (dirPath, funEv = undefined) => { if (ifFile == false) { return; } try { fs.watch(dirPath, (eventType, filename) => { if (filename) { if (funEv != undefined) { funEv({ "事件类型": eventType, "改变名称": filename }) } } }); } catch (err) { } } const listFile_ = async (dirPath, mode = 1, pathMode = 0) => { return await listDir(dirPath, mode, pathMode); } const listDir = async (dirPath, mode, pathMode) => { try { var res = new Array(); const files = await fs.readdirSync(dirPath, { withFileTypes: true }); for (const file of files) { const name = file.name; if (!file.isDirectory()) { let fileName = pathMode ? name : path.resolve(dirPath, name); res.push(fileName); } else { let value; await listDir(path.resolve(dirPath, name), mode, pathMode).then(res => { value = res }); if (mode == 1) { for (let i = 0; i < value.length; i++) res.push(value[i]); } else { let dir = {}; let dirName = pathMode ? name : path.resolve(dirPath, name); dir[dirName] = value; res.push(dir); } } } return res; } catch (err) { return null; } } function output(array, level) { let logFile = []; for (let i = 0; i < array.length; i++) { const item = array[i]; let levelChar = ''; for (let j = 0; j < level; j++) levelChar += ' '; levelChar += '-- '; if (!(item instanceof Object)) { logFile[logFile.length] = levelChar + item } else { const dirName = Object.keys(item)[0]; const dirArray = Object.values(item)[0]; logFile[logFile.length] = levelChar + dirName output(dirArray, level + 1); } } return logFile } exports.getExe = () => { if (ifFile == false) { return; } let pathAll = process.execPath; pathAll = pathAll.replaceAll("\\", "/"); if (process.platform !== 'darwin') { pathAll = pathAll.split("/"); if (pathAll.length >= 1) { pathAll = pathAll[pathAll.length - 1] pathAll = "/" + pathAll pathAll = process.execPath.substring(0, process.execPath.length - pathAll.length) } else { pathAll = process.execPath } } else { pathAll = pathAll.split("/Contents/Frameworks/Electron Helper (Renderer).app"); if (pathAll.length >= 1) { pathAll = pathAll[pathAll.length - 1] pathAll = "/Contents/Frameworks/Electron Helper (Renderer).app" + pathAll pathAll = process.execPath.substring(0, process.execPath.length - pathAll.length) let pathAll2 = pathAll.split("/"); if (pathAll2.length >= 1) { pathAll2 = pathAll2[pathAll2.length - 1] pathAll = pathAll.substring(0, pathAll.length - pathAll2.length) } } else { pathAll = process.execPath } } return pathAll; } exports.existsSync = (path) => { if (ifFile == false) { return; } try { return fs.existsSync(path); } catch (err) { return false; } } exports.writeFileSync = (data) => { if (ifFile == false) { return; } try { fs.writeFileSync(data["路径"], data["数据"]); return true; } catch (err) { return false; } } exports.writeFileBase64Sync = (data) => { if (ifFile == false) { return; } try { var b = new Buffer.from(data["数据"], 'base64') fs.writeFileSync(data["路径"], b); return true; } catch (err) { return false; } } exports.writeFileHexSync = (data) => { if (ifFile == false) { return; } try { var b = new Buffer.from(data["数据"], 'hex') fs.writeFileSync(data["路径"], b); return true; } catch (err) { return false; } } exports.readFileSync = (data) => { if (ifFile == false) { return; } if (fs.existsSync(data["路径"]) == true) { if (data["编码"] == undefined) { data["编码"] = "utf8"; } try { if (data["编码"] == "") { return fs.readFileSync(data["路径"]); } else { return fs.readFileSync(data["路径"], data["编码"]); } } catch (err) { return ""; } } else { return ""; } } exports.readFileBase64Sync = (data) => { if (ifFile == false) { return; } if (fs.existsSync(data["路径"]) == true) { try { let File = fs.readFileSync(data["路径"]); return Buffer.from(File).toString('base64'); } catch (err) { return ""; } } else { return ""; } } exports.readFileHexSync = (data) => { if (ifFile == false) { return; } if (fs.existsSync(data["路径"]) == true) { try { let File = fs.readFileSync(data["路径"]); return Buffer.from(File).toString('hex'); } catch (err) { return ""; } } else { return ""; } } exports.mkdirSync = (path) => { if (ifFile == false) { return; } if (fs.existsSync(path) == true) { return true; } else { try { fs.mkdirSync(path); return true; } catch (err) { return false } } } exports.cp = (path, path2, funEv = undefined) => { if (ifFile == false) { return; } fs.cp(path, path2, { recursive: true }, (err) => { if (err) { if (funEv != undefined) { funEv({ "状态": "失败", "数据": err }) } } else { if (funEv != undefined) { funEv({ "状态": "成功" }) } } }); } exports.renameSync = (data) => { if (ifFile == false) { return; } if (fs.existsSync(data["路径"]) == true) { try { fs.renameSync(data["路径"], data["路径2"]) return true; } catch (err) { return false } } else { return false; } } exports.unlink = (path, funEv = undefined) => { if (ifFile == false) { return; } if (fs.existsSync(path)) { if (path.indexOf(".") == -1) { ExeFun_unlinkFile(path, (ret) => { if (funEv != undefined) { funEv(ret) } }) return; } fs.unlink(path, (err) => { if (err) { if (funEv != undefined) { funEv({ "状态": "删除失败", "原因": err }) } } else { if (funEv != undefined) { funEv({ "状态": "删除成功" }) } } }); } else { funEv({ "状态": "删除失败", "原因": "路径不存在" }) } } exports.appendFile = (data) => { if (ifFile == false) { return; } fs.appendFile(data["路径"], data["数据"], (err) => { if (err) throw err; }); } exports.basename = (path_) => { if (ifFile == false) { return; } return path.basename(path_); } exports.dirname = (path_) => { return path.dirname(path_); } exports.extname = (path_) => { if (ifFile == false) { return; } return path.extname(path_); } exports.isAbsolute = (path_) => { if (ifFile == false) { return; } return path.isAbsolute(path_); } exports.normalize = (path_) => { if (ifFile == false) { return; } return path.normalize(path_); } exports.FileMsg = (path, EvFun) => { if (ifFile == false) { return; } fs.stat(path, function (error, stats) { let FileMsg = { "占用空间": 0, "实际大小": 0, "访问时间戳": 0, "访问时间": "", "修改时间戳": 0, "修改时间": "", "创建时间戳": 0, "创建时间": "", "是否成功": false }; if (error) { if (EvFun != undefined) { EvFun(FileMsg) } } else { FileMsg["占用空间"] = stats.blksize; FileMsg["实际大小"] = stats.size; FileMsg["访问时间戳"] = stats.atimeMs; FileMsg["访问时间"] = stats.atime; FileMsg["修改时间戳"] = stats.ctimeMs; FileMsg["修改时间"] = stats.ctime; FileMsg["创建时间戳"] = stats.birthtimeMs; FileMsg["创建时间"] = stats.birthtime; FileMsg["是否成功"] = true; if (EvFun != undefined) { EvFun(JSON.stringify(FileMsg)) } } }) } function deleteDirRecursively(dirPath) { return new Promise((resolve, reject) => { fs.readdir(dirPath, (err, files) => { if (err) { return reject(err); } let pending = files.length; if (pending === 0) { // 如果没有文件或子目录,则直接删除目录 return fs.rmdir(dirPath, err => { if (err) { return reject(err); } resolve(); }); } files.forEach(file => { const filePath = path.join(dirPath, file); fs.stat(filePath, (err, stat) => { if (err) { return reject(err); } if (stat.isDirectory()) { // 如果是目录,则递归删除 deleteDirRecursively(filePath).then(() => { if (--pending === 0) { // 所有子目录和文件都删除后,删除当前目录 fs.rmdir(dirPath, err => { if (err) { return reject(err); } resolve(); }); } }).catch(reject); } else { // 如果是文件,则删除 fs.unlink(filePath, err => { if (err) { return reject(err); } if (--pending === 0) { // 所有文件都删除后,删除目录 fs.rmdir(dirPath, err => { if (err) { return reject(err); } resolve(); }); } }); } }); }); }); }); } function ExeFun_unlinkFile(P_Name, fun) { if (P_Name == undefined || P_Name == null) { fun({ "状态": "失败", "原因": "删除失败,路径不能为未定义内容或空对象" }) return; } if (P_Name.indexOf("\\") != -1) { P_Name = P_Name.replaceAll("\\", "/") } if (P_Name.indexOf("//") != -1) { P_Name = P_Name.replaceAll("//", "/") } var stat = fs.lstatSync(P_Name); if (stat.isFile() == true) { //文件 fs.unlink(P_Name, (err) => { if (err) { fun({ "状态": "失败", "原因": err }) return; } fun({ "状态": "成功" }) }); } else { deleteDirRecursively(P_Name) .then(() => fun({ "状态": "成功" })) .catch(err => fun({ "状态": "失败", "原因": err })); } } function runExec_(Path, cmdCode, SetProcessYesMsg, SetProcessNoMsg, SetProcessEndMsg, encoding_ = "GBK") { let workerProcess;//子进程名称 workerProcess = exec(cmdCode, { cwd: Path, encoding: encoding_ }) // 打印正常的后台可执行程序输出 workerProcess.stdout.on('data', function (data) { const decoder = new TextDecoder(); let JSONData = { "输出数据": decoder.decode(data) } if (SetProcessYesMsg != undefined) { SetProcessYesMsg(JSONData) } }) // 打印错误的后台可执行程序输出 workerProcess.stderr.on('data', function (data) { const decoder = new TextDecoder(); let JSONData = { "输出数据": decoder.decode(data) } if (SetProcessNoMsg != undefined) { SetProcessNoMsg(JSONData) } }) // 退出之后的输出 workerProcess.on('close', function (code) { if (SetProcessEndMsg != undefined) { SetProcessEndMsg(code) } }) }