GameServerManager/docs/文件监视功能说明.md
2025-10-15 21:19:45 +08:00

166 lines
4.4 KiB
Markdown
Raw Permalink 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.

# 文件监视功能说明
## 功能概述
文本编辑器现在支持自动监测打开文件的外部修改。当文件在其他地方(如其他编辑器、命令行等)被修改时,系统会自动检测并处理这些变化。
## 功能特性
### 1. 自动监视
- 当您在编辑器中打开文件时,系统会自动开始监视该文件
- 不需要手动开启或配置,完全自动化
### 2. 智能处理
**场景一:文件未被修改**
- 如果您打开的文件没有任何未保存的修改
- 系统会自动重新加载文件内容
- 编辑器会无缝更新到最新版本
**场景二:文件有未保存修改**
- 如果您对文件有未保存的修改
- 系统会弹出确认对话框
- 您可以选择:
- **重新加载文件**:放弃当前修改,加载磁盘上的最新内容
- **保留我的修改**:保留您当前的修改,忽略外部变化
### 3. 实时监测
- 使用 WebSocket 实现实时文件监视
- 基于文件系统的原生监视机制(`fs.watch`
- 低延迟,高效率
## 技术实现
### 后端架构
**文件监视管理器** (`server/src/modules/file/FileWatchManager.ts`)
- 管理所有被监视的文件
- 使用 Node.js 的 `fs.watch` API
- 跟踪文件修改时间,避免重复通知
- 支持多客户端同时监视同一文件
**WebSocket 事件处理** (`server/src/index.ts`)
- `watch-file`: 开始监视文件
- `unwatch-file`: 停止监视文件
- `file-changed`: 通知客户端文件已变化
### 前端架构
**文件存储** (`client/src/stores/fileStore.ts`)
- 管理被监视文件列表
- 处理文件变化事件
- 智能判断是否需要弹出确认对话框
**UI 组件** (`client/src/components/FileChangedDialog.tsx`)
- 美观的确认对话框
- 清晰的警告提示
- 友好的操作按钮
**页面集成** (`client/src/pages/FileManagerPage.tsx`)
- 自动监视/取消监视文件
- 响应文件变化事件
- 显示用户通知
## 使用流程
1. **打开文件**
```
用户双击文件 → 文件在编辑器中打开 → 系统自动开始监视
```
2. **外部修改文件**
```
其他程序修改文件 → 系统检测到变化 → 触发处理逻辑
```
3. **自动处理**
```
检查是否有修改 → 无修改:自动重载 | 有修改:弹出对话框
```
4. **关闭文件**
```
用户关闭文件 → 系统自动停止监视该文件
```
## 注意事项
### 性能考虑
- 监视器使用 `{ persistent: false }` 选项,不会阻止进程退出
- 支持多客户端共享监视,节省资源
- 自动清理断开连接客户端的监视
### 智能识别保存操作
- 系统能够区分"面板内保存"和"外部修改"
- 当您在面板中保存文件时,不会触发"文件已修改"对话框
- 使用 `ignoreNextChange` 标志机制,在保存操作前设置忽略标志
- 保存完成后自动清除标志,恢复正常监视
### 安全性
- 只监视已打开的文件
- 路径验证确保安全性
- 客户端断开时自动清理
### 兼容性
- 支持 Windows、Linux、macOS
- 支持网络文件系统(可能有延迟)
- 支持各种编码格式
## 故障排除
### 文件变化未被检测
**可能原因:**
- 某些编辑器使用"安全保存"模式(先删除再创建新文件)
- 网络文件系统延迟
- 文件被锁定
**解决方法:**
- 手动刷新编辑器
- 尝试重新打开文件
### ~~保存时误报"文件已修改"~~ (已修复)
**问题描述:**
- ~~在面板中保存文件时,总是弹出"文件已在外部修改"对话框~~
**修复方案:**
- ✅ 已实现智能识别机制
- ✅ 保存操作会自动设置忽略标志
- ✅ 只有真正的外部修改才会触发对话框
### 频繁弹出对话框
**可能原因:**
- 自动保存工具频繁修改文件
- 文件被多个程序同时编辑
**解决方法:**
- 关闭自动保存工具
- 确保只有一个程序在编辑文件
## 未来改进
- [ ] 支持配置是否启用文件监视
- [ ] 支持配置监视延迟时间
- [ ] 支持显示文件变化差异对比
- [ ] 支持合并外部修改和本地修改
## 相关文件
### 后端
- `server/src/modules/file/FileWatchManager.ts` - 文件监视管理器
- `server/src/index.ts` - WebSocket 事件处理
### 前端
- `client/src/stores/fileStore.ts` - 文件状态管理
- `client/src/components/FileChangedDialog.tsx` - 确认对话框组件
- `client/src/pages/FileManagerPage.tsx` - 文件管理页面集成
- `client/src/utils/socket.ts` - WebSocket 客户端