import fs from "node:fs"; import path from "path"; /** * 检查文件是否存在并且删除 * @param file * @returns {Promise} */ export async function checkAndRemoveFile(file) { try { await fs.promises.access(file); await fs.promises.unlink(file); logger.mark('文件已存在'); } catch (err) { if (err.code !== 'ENOENT') { throw err; } } } /** * 创建文件夹,如果不存在 * @param dir * @returns {Promise} */ export async function mkdirIfNotExists(dir) { try { await fs.promises.access(dir); } catch (err) { if (err.code === 'ENOENT') { await fs.promises.mkdir(dir, { recursive: true }); } else { throw err; } } } /** * 删除文件夹下所有文件 * @returns {Promise} * @param folderPath */ export async function deleteFolderRecursive(folderPath) { try { const files = await readCurrentDir(folderPath); const actions = files.map(async (file) => { const curPath = path.join(folderPath, file); const stat = await fs.promises.lstat(curPath); if (stat.isDirectory()) { // recurse return deleteFolderRecursive(curPath); } else { // delete file return fs.promises.unlink(curPath); } }); await Promise.allSettled(actions); return files.length; } catch (error) { logger.error(error); return 0; } } /** * 读取当前文件夹的所有文件和文件夹 * @param path 路径 * @param printTree 是否打印树状图 * @returns {Promise<*>} 返回一个包含文件名的数组 */ export async function readCurrentDir(path) { try { const files = await fs.promises.readdir(path); return files; } catch (err) { logger.error(err); } } /** * 拷贝文件 * @param srcDir * @param destDir * @returns {Promise<*|null>} */ export async function copyFiles(srcDir, destDir) { try { await mkdirIfNotExists(destDir); const files = await readCurrentDir(srcDir); for (const file of files) { const srcFile = path.join(srcDir, file); const destFile = path.join(destDir, file); await fs.promises.copyFile(srcFile, destFile); } } catch (error) { logger.error(error); } return null; } /** * 转换路径图片为base64格式 * @param filePath 图片路径 * @return {Promise} */ export async function toBase64(filePath) { try { // 读取文件数据 const fileData = await fs.readFileSync(filePath); // 将文件数据转换为Base64字符串 const base64Data = fileData.toString('base64'); // 返回Base64字符串 return `data:${getMimeType(filePath)};base64,${base64Data}`; } catch (error) { throw new Error(`读取文件时出错: ${error.message}`); } } /** * 辅助函数:根据文件扩展名获取MIME类型 * @param filePath * @return {*|string} */ function getMimeType(filePath) { const mimeTypes = { '.jpg': 'image/jpeg', '.jpeg': 'image/jpeg', '.png': 'image/png', '.gif': 'image/gif', '.pdf': 'application/pdf', '.txt': 'text/plain', // 添加其他文件类型和MIME类型的映射 }; const ext = filePath.substring(filePath.lastIndexOf('.')).toLowerCase(); return mimeTypes[ext] || 'application/octet-stream'; }