121 lines
3.6 KiB
JavaScript
121 lines
3.6 KiB
JavaScript
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
|
||
}; |