MCSM-Daemon/test/extend_worker.js
2021-12-05 15:45:32 +08:00

76 lines
2.3 KiB
JavaScript

const path = require("path");
const fs = require("fs");
const compressing = require("compressing");
const fsex = require("fs-extra");
// const os = require('os');
// 此处使用临时解决方案
// let SYSTEM_CODE = null;
// if (os.platform() == "win32")
const SYSTEM_CODE = "GBK";
// else
// SYSTEM_CODE = 'UTF-8';
// 任务参数获取
const argv = process.argv;
const realArgv = argv.filter((val, index) => {
return index >= 2;
});
// 特殊文件操作子进程
// 为了防止用户解压/压缩/删除 文件数量过大导致整个面板反应速度下降或者无反应
// 所有耗时的文件操作(除非异步)均写入此。
if (realArgv.length >= 1) {
const ACTION = realArgv[0];
//解压子进程开始执行
if (ACTION === "extract") {
//执行解压
const absPath = realArgv[1];
//目录名与原文件同名
const zipExtractDir = path.normalize(path.dirname(absPath) + "/解压文件_" + path.basename(absPath, path.extname(absPath)));
// 创建目标目录
try {
fs.mkdirSync(zipExtractDir);
} catch (ignore) {
// 忽略创建目录错误
}
// 进行解压操作
compressing.zip
.uncompress(absPath, zipExtractDir, {
zipFileNameEncoding: SYSTEM_CODE
})
.then(() => {
// BUG note: 此处无法使用 MCSM 全局变量,此为额外任务子进程。感谢 @ColorfulGhost
console.log("解压任务", absPath, "成功.");
})
.catch((err) => {
console.log("解压任务", absPath, "失败,原因:\n", err);
});
}
// 文件删除子进程开始执行
// 此进程用于删除大量文件时使用,以防造成面板卡顿
if (ACTION === "remove") {
fsex.removeSync(realArgv[1]);
}
// 文件压缩子进程
// 此压缩库支持异步写法,但以防不测,依然列入子进程
if (ACTION === "compress") {
const absPath = realArgv[1];
const compressZipPath = path.normalize(path.dirname(absPath) + "/压缩文件_" + path.basename(absPath) + ".zip");
// 进行压缩操作
compressing.zip
.compressDir(absPath, compressZipPath, {
zipFileNameEncoding: SYSTEM_CODE
})
.then(() => {
console.log("压缩任务", absPath, "成功.");
})
.catch((err) => {
console.log("压缩任务", absPath, "失败,原因:\n", err);
});
}
}