const path = require('path'); const fs = require('fs'); const { app } = require('electron'); // 判断是否为开发环境 const isDev = process.env.NODE_ENV === 'development' || !app.isPackaged; // 根据环境选择数据目录 let dataDir; if (isDev) { // 开发环境:数据存储在工程的data目录 dataDir = path.join(process.cwd(), 'data'); } else { try { // 生产环境(便携模式): // 1. 获取可执行文件所在目录 const exePath = process.execPath; const exeDir = path.dirname(exePath); // 2. 检查是否在临时目录中 const isTempDir = exeDir.toLowerCase().includes('temp') || exeDir.toLowerCase().includes('tmp'); if (isTempDir) { // 3. 如果在临时目录,使用用户主目录下的固定文件夹 const userDataDir = path.join(app.getPath('userData'), 'StatExamData'); // 创建用户数据目录并使用 dataDir = userDataDir; console.log(`检测到临时目录环境,数据目录已切换至: ${dataDir}`); } else { // 直接使用可执行文件所在目录下的data文件夹 dataDir = path.join(exeDir, 'data'); } // 确保数据目录存在 if (!fs.existsSync(dataDir)) { fs.mkdirSync(dataDir, { recursive: true }); console.log(`创建数据目录: ${dataDir}`); } // 添加数据库文件复制逻辑 copyDatabaseFilesIfNeeded(dataDir); } catch (error) { console.error('获取数据目录失败:', error); // 错误情况下使用用户数据目录作为后备 dataDir = path.join(app.getPath('userData'), 'StatExamData'); if (!fs.existsSync(dataDir)) { fs.mkdirSync(dataDir, { recursive: true }); } } } /** * 检查并复制数据库文件 * @param {string} targetDataDir - 目标数据目录 */ function copyDatabaseFilesIfNeeded(targetDataDir) { try { // 定义数据库文件名 const dbFiles = ['system.db', 'user.db', '.gitignore']; // 定义源数据目录(resources中的data目录) const sourceDataDir = path.join(process.resourcesPath, 'data'); console.log(`检查是否需要从${sourceDataDir}复制数据库文件到${targetDataDir}`); // 检查源数据目录是否存在 if (!fs.existsSync(sourceDataDir)) { console.warn(`源数据目录不存在: ${sourceDataDir}`); return; } // 检查并复制每个文件 dbFiles.forEach(fileName => { const targetFilePath = path.join(targetDataDir, fileName); const sourceFilePath = path.join(sourceDataDir, fileName); // 只有当目标文件不存在时才复制 if (!fs.existsSync(targetFilePath) && fs.existsSync(sourceFilePath)) { try { fs.copyFileSync(sourceFilePath, targetFilePath); console.log(`成功复制文件: ${fileName} 到 ${targetDataDir}`); } catch (copyError) { console.error(`复制文件${fileName}失败:`, copyError); } } else if (fs.existsSync(targetFilePath)) { console.log(`文件已存在,跳过复制: ${fileName}`); } else { console.warn(`源文件不存在: ${sourceFilePath}`); } }); } catch (error) { console.error('复制数据库文件时发生错误:', error); } } // 输出调试信息 console.log('应用是否打包:', app.isPackaged); console.log('数据目录路径:', dataDir); // 系统数据库路径 function getSystemDbPath() { return path.join(dataDir, 'system.db'); } // 用户数据库路径 function getUserDbPath() { return path.join(dataDir, 'user.db'); } // 导出获取数据目录的方法,便于调试 function getDataDir() { return dataDir; } module.exports = { getSystemDbPath, getUserDbPath, getDataDir };