From 59dbbb288c163f1c4c62614ff4a42ec07d09c882 Mon Sep 17 00:00:00 2001 From: Miao_Spring <539943419@qq.com> Date: Fri, 16 Aug 2024 00:40:16 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=89=AA=E5=88=87?= =?UTF-8?q?=E4=B8=8E=E9=87=8D=E5=91=BD=E5=90=8D=E7=9A=84api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/useCutApi.js | 33 ++++++++++++++++++++++++++++++++ api/useDeleteApi.js | 14 ++++---------- api/useQueryApi.js | 4 ++++ api/useRenameApi.js | 34 +++++++++++++++++++++++++++++++++ config.js | 4 +++- hooks/useFsOprateEventCenter.js | 2 +- index.js | 4 ++++ 7 files changed, 83 insertions(+), 12 deletions(-) create mode 100644 api/useCutApi.js create mode 100644 api/useRenameApi.js diff --git a/api/useCutApi.js b/api/useCutApi.js new file mode 100644 index 0000000..90a83ff --- /dev/null +++ b/api/useCutApi.js @@ -0,0 +1,33 @@ +import { api, staticPath } from "../config.js"; +import path from "path"; +import useFsOprateEventCenter from "../hooks/useFsOprateEventCenter.js"; +import fs from "fs"; +import express from "express"; + +const fsOprateEventCenter = useFsOprateEventCenter(); + +function cutPath(targetPath, newPath) { + return new Promise((resolve, reject) => { + fs.stat(targetPath, (err, stats) => { + if (err) { + console.log(err); + return reject(err); + } + + fs.rename(targetPath, newPath, err => { + if (err) return reject(err); + resolve(); + }); + }); + }); +} + +export default function useCutApi(app) { + app.post(api.cut, express.json(), (req, res) => { + const decodedPath = decodeURIComponent(req.path).substring(api.cut.length - 1); + const targetPath = path.join(staticPath, decodedPath); + const newPath = path.join(staticPath, req.body.newPath, path.basename(targetPath)); + const eventId = fsOprateEventCenter.push(cutPath(targetPath, newPath)); + res.send({ eventId }); + }); +} diff --git a/api/useDeleteApi.js b/api/useDeleteApi.js index 36090b0..4ad9f02 100644 --- a/api/useDeleteApi.js +++ b/api/useDeleteApi.js @@ -10,27 +10,21 @@ function deletePath(targetPath) { fs.stat(targetPath, (err, stats) => { if (err) { console.log(err) - return reject(err); // 如果获取状态失败,返回错误 + return reject(err); } if (stats.isFile()) { - // 如果是文件,直接删除 fs.rm(targetPath, { recursive: true }, (err) => { if (err) return reject(err); - resolve(); // 删除成功 + resolve(); }); - // console.log('delete file') } else if (stats.isDirectory()) { - // 如果是文件夹,递归删除 fs.rm(targetPath, { recursive: true }, (err) => { if (err) return reject(err); - resolve(); // 删除成功 + resolve(); }); - // console.log('delete directory') } else { - // console.log('unknow file') - // 其他类型(如符号链接等),可以根据需要处理 - reject('unknow file'); // 这里选择不处理其他类型 + reject('unknow file'); } }); }); diff --git a/api/useQueryApi.js b/api/useQueryApi.js index 3da6003..08b25a7 100644 --- a/api/useQueryApi.js +++ b/api/useQueryApi.js @@ -3,6 +3,10 @@ import useFsOprateEventCenter from "../hooks/useFsOprateEventCenter.js"; const fsOprateEventCenter = useFsOprateEventCenter(); +/** + * 获取一个文件操作事件的结果 + * @returns {any} + */ export default function useQueryApi(app) { app.get(api.query, (req, res) => { const id = req.query.id; diff --git a/api/useRenameApi.js b/api/useRenameApi.js new file mode 100644 index 0000000..cd34037 --- /dev/null +++ b/api/useRenameApi.js @@ -0,0 +1,34 @@ +import { api, staticPath } from "../config.js"; +import path from "path"; +import useFsOprateEventCenter from "../hooks/useFsOprateEventCenter.js"; +import fs from "fs"; +import express from "express"; + +const fsOprateEventCenter = useFsOprateEventCenter(); + +function renamePath(targetPath, newName) { + return new Promise((resolve, reject) => { + fs.stat(targetPath, (err, stats) => { + if (err) { + console.log(err); + return reject(err); + } + + const newTargetPath = path.join(path.dirname(targetPath), newName); + fs.rename(targetPath, newTargetPath, err => { + if (err) return reject(err); + resolve(); + }); + }); + }); +} + +export default function useRenameApi(app) { + app.post(api.rename, express.json(), (req, res) => { + const decodedPath = decodeURIComponent(req.path).substring(api.rename.length - 1); + const targetPath = path.join(staticPath, decodedPath); + const newName = req.body.newName; + const eventId = fsOprateEventCenter.push(renamePath(targetPath, newName)); + res.send({ eventId }); + }); +} diff --git a/config.js b/config.js index f7984e4..7bd8ba1 100644 --- a/config.js +++ b/config.js @@ -6,9 +6,11 @@ export const port = 17705; export const api = { get: `/${"get"}`, + query: `/${"query"}`, upload: `/${"upload"}/*`, delete: `/${"delete"}/*`, - query: `/${"query"}` + rename: `/${"rename"}/*`, + cut: `/${"cut"}/*`, } export default { staticPath, port, api } \ No newline at end of file diff --git a/hooks/useFsOprateEventCenter.js b/hooks/useFsOprateEventCenter.js index aa73bf1..b421950 100644 --- a/hooks/useFsOprateEventCenter.js +++ b/hooks/useFsOprateEventCenter.js @@ -59,7 +59,7 @@ class FsOprateEventCenter { const res = {status} if( ['success', 'failed'].includes(status) ){ if(status === 'failed'){ - res.result = this.eventMap[id].event.failedEvent + res.failedEvent = this.eventMap[id].event.failedEvent } clearInterval(this.eventMap[id].timer) this.eventMap[id] = undefined diff --git a/index.js b/index.js index 1175330..582a809 100644 --- a/index.js +++ b/index.js @@ -7,6 +7,8 @@ import useGetApi from "./api/useGetApi.js"; import useUploadApi from "./api/useUploadApi.js"; import useDeleteApi from "./api/useDeleteApi.js"; import useQueryApi from "./api/useQueryApi.js"; +import useRenameApi from "./api/useRenameApi.js"; +import useCutApi from "./api/useCutApi.js"; const { staticPath, port, api } = Config; @@ -21,6 +23,8 @@ useGetApi(app); useUploadApi(app); useDeleteApi(app); useQueryApi(app); +useRenameApi(app); +useCutApi(app); app.listen(port, "::", () => { const interfaces = os.networkInterfaces();