# AutoBakService
**Repository Path**: leliwang/auto-bak-service
## Basic Information
- **Project Name**: AutoBakService
- **Description**: 自动同步文件夹
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-08-09
- **Last Updated**: 2026-08-09
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# AutoBakService
`AutoBakService` 是一个基于 `.NET Framework 4.7.2` 的 Windows 服务,用于监听源目录变化,并将符合规则的文件同步到目标目录。
## 功能概览
- 监听源目录及其子目录的文件变化
- 支持首次启动时全量同步
- 日常运行时以差量同步为主,监控异常时回退全量同步
- 支持按文件名关键字或正则规则筛选同步对象
- 支持源目录按保留数量清理旧文件
- 支持事件日志和文件日志双写
- 支持日志文件按天保留
## 运行环境
- Windows
- .NET Framework 4.7.2
- 需要管理员权限执行服务安装、卸载
## 项目文件
- 入口程序:`Program.cs`
- 服务核心逻辑:`AutoBakService.cs`
- 日志实现:`AppLogger.cs`
- 配置文件:`App.config`
## 配置说明
配置位于 `App.config` 的 `appSettings`。
### 目录配置
```xml
```
- `source_path`:源目录,必须已存在
- `target_path`:目标备份目录,不存在时会自动创建
### 保留规则
```xml
```
- `keep_file_count = 0`
- 同步所有文件
- 不删除源目录中的任何文件
- `keep_file_count > 0`
- 仅对命中匹配规则的文件执行同步和保留数量控制
- 保留逻辑按“每个目录”分别执行
- 按最后写入时间倒序保留最近 `N` 个文件
### 文件名匹配规则
```xml
```
- `file_name_pattern_mode = keyword`
- 按关键字包含匹配
- 支持多个关键字,分隔符支持:`,` `;` `|` 空格
- 示例:`bak,temp,log`
- `file_name_pattern_mode = regex`
- 按正则表达式匹配
- 示例:`^(bak|temp|log).*\.zip$`
- `file_name_keyword = *`
- 表示匹配所有文件
### 重试配置
```xml
```
- `retry_delay`:失败后重试间隔,单位秒
- `max_retry_times`:最大重试次数
### 日志配置
```xml
```
- `log_dir`:日志目录
- `log_keep_days`:日志文件保留天数,仅保留最近 `N` 天 `.log` 文件
## 同步行为
### 正常同步
- 服务启动时执行一次全量同步
- 文件变化后执行差量同步
- `FileSystemWatcher` 异常时回退到全量同步
### 删除行为
- 源文件删除时,目标对应文件也会删除
- 源子目录删除时,目标对应子目录也会删除
- 目标目录默认按镜像方式清理
### 源目录为空时
- 目标根目录会保留
- 目标根目录中的文件和子目录会被清空
### 重命名行为
- 源文件或目录重命名后
- 目标旧路径会删除
- 目标新路径会重新同步
## 服务命令
程序支持交互运行和服务运行两种模式。
### 交互命令
直接运行 EXE 可使用以下命令:
```powershell
AutoBakService.exe install
AutoBakService.exe uninstall
AutoBakService.exe toggle
AutoBakService.exe status
```
说明:
- `install`:安装并启动服务
- `uninstall`:停止并卸载服务
- `toggle`:已安装则卸载,未安装则安装并启动
- `status`:查看服务是否已安装
不带参数时,默认等价于:
```powershell
AutoBakService.exe toggle
```
## 日志说明
### 事件日志
服务仍会写入 Windows `Application` 事件日志,事件源为:
```text
AutoBackupService
```
### 文件日志
- 日志文件输出到 `log_dir`
- 按日期命名,例如:`2026-08-09.log`
- 记录内容包括:
- 服务启动成功/失败
- 文件监控异常
- 差量处理失败
- 全量同步失败
- 文件复制、删除、创建目录失败
- 交互命令失败
## 常见问题
### 1. 服务安装成功但启动失败
优先检查:
- `source_path` 是否存在
- 当前账号是否对源目录和目标目录有权限
- `log_dir` 是否可写
然后查看:
- Windows 事件日志
- `log_dir` 下当天的 `.log` 文件
### 2. 为什么没有弹窗提醒
真正作为 Windows 服务启动时,进程运行在服务会话中,不适合依赖桌面弹窗。当前项目以:
- 事件日志
- 文件日志
作为主要失败提醒方式。
### 3. 为什么目标根目录没有被删除
当前设计是:
- 保持目标内容与源目录镜像同步
- 但保留目标根目录本身
因此源目录清空后,`target_path` 会保留为空目录。
## 构建
```powershell
dotnet build "AutoBakService.csproj" -c Debug
```
## 发布部署
### 生成发布包
执行以下脚本生成 `Release` 发布目录:
```powershell
powershell -ExecutionPolicy Bypass -File ".\deploy\publish-release.ps1"
```
默认输出目录:
```text
artifacts\release\AutoBakService
```
发布目录包含:
- `AutoBakService.exe`
- `AutoBakService.exe.config`
- `README.md`
- `LICENSE`
- `logs\`
- 安装/卸载/启停脚本
### 部署步骤
1. 执行发布脚本生成发布包
2. 将 `artifacts\release\AutoBakService` 整个目录复制到目标机器
3. 按需修改目标目录中的 `AutoBakService.exe.config`
4. 确认 `source_path` 已存在,且当前账号有权限访问
5. 以管理员身份运行 `install-service.bat`
### 发布目录脚本
- `install-service.bat`:安装并启动服务
- `uninstall-service.bat`:停止并卸载服务
- `start-service.bat`:启动服务
- `stop-service.bat`:停止服务
- `status-service.bat`:查看服务状态
### 升级部署建议
1. 以管理员身份运行 `stop-service.bat`
2. 替换发布目录中的程序文件
3. 保留原有配置文件和日志目录
4. 以管理员身份运行 `start-service.bat`
## 建议运维流程
1. 先配置 `App.config`
2. 确认 `source_path` 已存在
3. 以管理员身份运行:
```powershell
AutoBakService.exe install
```
4. 检查服务状态和日志输出