init-dirs.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /**
  2. * 目录初始化模块 - 确保应用需要的所有目录都存在
  3. */
  4. const fs = require('fs').promises;
  5. const path = require('path');
  6. const logger = require('./logger');
  7. /**
  8. * 确保所有必需的目录存在
  9. */
  10. // 添加缓存机制
  11. const checkedDirs = new Set();
  12. async function ensureDirectoriesExist() {
  13. const dirs = [
  14. // 文档目录
  15. path.join(__dirname, 'documentation'),
  16. // 日志目录
  17. path.join(__dirname, 'logs'),
  18. // 图片目录
  19. path.join(__dirname, 'web', 'images'),
  20. // 数据目录(SQLite数据库文件)
  21. path.join(__dirname, 'data'),
  22. // 配置目录
  23. path.join(__dirname, 'config'),
  24. // 临时文件目录
  25. path.join(__dirname, 'temp'),
  26. // 文档数据目录
  27. path.join(__dirname, 'web', 'data', 'documentation')
  28. ];
  29. for (const dir of dirs) {
  30. if (checkedDirs.has(dir)) continue;
  31. try {
  32. await fs.access(dir);
  33. logger.info(`目录已存在: ${dir}`);
  34. } catch (error) {
  35. if (error.code === 'ENOENT') {
  36. try {
  37. await fs.mkdir(dir, { recursive: true });
  38. logger.success(`创建目录: ${dir}`);
  39. } catch (mkdirError) {
  40. logger.error(`创建目录 ${dir} 失败: ${mkdirError.message}`);
  41. throw mkdirError;
  42. }
  43. } else {
  44. logger.error(`检查目录 ${dir} 失败: ${error.message}`);
  45. throw error;
  46. }
  47. }
  48. checkedDirs.add(dir);
  49. }
  50. // 确保文档索引存在,但不再添加默认文档
  51. const docIndexPath = path.join(__dirname, 'web', 'data', 'documentation', 'index.json');
  52. try {
  53. await fs.access(docIndexPath);
  54. logger.info('文档索引已存在');
  55. } catch (error) {
  56. if (error.code === 'ENOENT') {
  57. try {
  58. // 创建一个空的文档索引
  59. await fs.writeFile(docIndexPath, JSON.stringify([]), 'utf8');
  60. logger.success('创建了空的文档索引文件');
  61. } catch (writeError) {
  62. logger.error(`创建文档索引失败: ${writeError.message}`);
  63. }
  64. }
  65. }
  66. }
  67. // 如果直接运行此脚本
  68. if (require.main === module) {
  69. ensureDirectoriesExist()
  70. .then(() => logger.info('目录初始化完成'))
  71. .catch(err => {
  72. logger.error('目录初始化失败:', err);
  73. process.exit(1);
  74. });
  75. }
  76. module.exports = { ensureDirectoriesExist };