exam11/background/db/path.js
chenqiang c050516c29 path
2025-09-10 12:13:10 +08:00

109 lines
3.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const path = require('path');
const fs = require('fs');
const { app } = require('electron');
// 判断是否为开发环境
const isDev = process.env.NODE_ENV === 'development' || !app.isPackaged;
// 检测是否为便携模式
let isPortable = false;
let dataDir;
if (isDev) {
// 开发环境数据存储在工程的data目录
dataDir = path.join(process.cwd(), 'data');
} else {
try {
// 关键修改:对于打包后的应用,尤其是便携模式,我们需要更智能地确定数据目录位置
// 1. 获取进程可执行文件路径
const execPath = process.execPath;
// 2. 获取可执行文件所在目录
let appDir = path.dirname(execPath);
console.log('进程可执行文件路径:', execPath);
console.log('进程目录:', appDir);
// 3. 检测是否存在portable.txt文件标记文件
const portableFlagPath = path.join(appDir, 'portable.txt');
if (fs.existsSync(portableFlagPath)) {
isPortable = true;
console.log('检测到便携模式标记文件');
}
// 4. 检查是否在临时目录中运行(常见于便携应用解压运行时)
const isTempDir = appDir.includes('Temp') || appDir.includes('tmp');
console.log('是否在临时目录中运行:', isTempDir);
// 5. 特殊处理便携模式下的临时目录问题
if (isTempDir) {
// 尝试通过其他方式获取实际的应用目录
// - 方法1检查可执行文件名
const exeName = path.basename(execPath);
console.log('可执行文件名:', exeName);
// - 方法2使用process.argv[0](启动路径)
const startupPath = process.argv[0];
console.log('启动路径:', startupPath);
// 关键点:对于便携应用,我们需要确保数据目录与实际的可执行文件(用户看到的那个)在同一目录
// 假设可执行文件名为StatExamPortable_*.exe我们需要找到这个文件的实际位置
// 由于在临时目录中,我们需要向上查找或使用相对路径策略
// 这里使用一种通用策略在Windows系统上便携应用的临时目录通常在用户临时文件夹下
// 我们将数据目录放在与临时目录不同的位置,确保数据持久性
// 尝试获取用户主目录
const userHome = app.getPath('home');
console.log('用户主目录:', userHome);
// 便携式应用的数据目录应该放在一个稳定的位置,而不是临时目录
// 这里我们选择放在用户主目录下的特定文件夹
const portableDataDir = path.join(userHome, 'StatExamData');
dataDir = portableDataDir;
// 创建便携模式标记文件
const stablePortableFlagPath = path.join(portableDataDir, '..', 'portable.txt');
if (!fs.existsSync(stablePortableFlagPath)) {
try {
fs.writeFileSync(stablePortableFlagPath, '');
console.log('创建便携模式标记文件:', stablePortableFlagPath);
} catch (error) {
console.error('创建便携模式标记文件失败:', error);
}
}
} else {
// 正常情况下,数据目录与可执行文件同级
dataDir = path.join(appDir, 'data');
}
} catch (error) {
console.error('确定数据目录时出错:', error);
// 发生错误时使用默认策略
const fallbackDir = path.join(app.getPath('userData'), 'data');
dataDir = fallbackDir;
console.log('使用备用数据目录:', fallbackDir);
}
}
// 确保数据目录存在
if (!fs.existsSync(dataDir)) {
fs.mkdirSync(dataDir, { recursive: true });
console.log(`创建数据目录: ${dataDir}`);
}
// 系统数据库路径
function getSystemDbPath() {
return path.join(dataDir, 'system.db');
}
// 用户数据库路径
function getUserDbPath() {
return path.join(dataDir, 'user.db');
}
// 导出函数供其他模块使用
module.exports = {
getSystemDbPath,
getUserDbPath
};