添加项目文件。
This commit is contained in:
124
Docs/备份功能优化说明.md
Normal file
124
Docs/备份功能优化说明.md
Normal file
@@ -0,0 +1,124 @@
|
||||
# 备份功能优化说明
|
||||
|
||||
## 问题描述
|
||||
|
||||
原始的"应用并保存"功能在创建备份文件时,如果`.bak`文件已存在,会直接覆盖现有备份,没有提供用户选择或保留历史备份的选项。
|
||||
|
||||
## 优化方案
|
||||
|
||||
采用最小改动方案,在现有的`ApplyToolOrderToDrillTape`方法中添加智能备份逻辑:
|
||||
|
||||
### 功能特性
|
||||
|
||||
1. **智能检测**:自动检测`.bak`文件是否已存在
|
||||
2. **用户选择**:提供三种处理选项
|
||||
- 覆盖现有备份文件
|
||||
- 创建带时间戳的新备份文件
|
||||
- 取消保存操作
|
||||
3. **时间戳格式**:使用`yyyyMMdd_HHmmss`格式,确保文件名唯一且易于识别
|
||||
4. **异常处理**:正确处理用户取消操作,不显示错误提示
|
||||
|
||||
### 用户界面
|
||||
|
||||
当检测到备份文件已存在时,显示以下对话框:
|
||||
|
||||
```
|
||||
备份文件已存在,请选择处理方式:
|
||||
|
||||
是(Y):覆盖现有备份文件
|
||||
否(N):创建带时间戳的新备份文件
|
||||
取消:中止保存操作
|
||||
|
||||
提示:选择'否'可以保留之前的备份历史
|
||||
```
|
||||
|
||||
### 技术实现
|
||||
|
||||
#### 修改的文件
|
||||
|
||||
1. **MainWindowViewModel.cs**
|
||||
- 修改`ApplyToolOrderToDrillTape`方法
|
||||
- 添加备份文件检测和用户选择逻辑
|
||||
- 改进异常处理
|
||||
|
||||
2. **MainWindow.xaml.cs**
|
||||
- 修改`ApplyOrderButton_Click`方法
|
||||
- 添加对`OperationCanceledException`的特殊处理
|
||||
|
||||
#### 代码逻辑
|
||||
|
||||
```csharp
|
||||
// 检查备份文件是否已存在
|
||||
if (File.Exists(backupFilePath))
|
||||
{
|
||||
var result = MessageBox.Show(
|
||||
"备份文件已存在,请选择处理方式:\n\n" +
|
||||
"是(Y):覆盖现有备份文件\n" +
|
||||
"否(N):创建带时间戳的新备份文件\n" +
|
||||
"取消:中止保存操作\n\n" +
|
||||
"提示:选择'否'可以保留之前的备份历史",
|
||||
"备份选项",
|
||||
MessageBoxButton.YesNoCancel,
|
||||
MessageBoxImage.Question);
|
||||
|
||||
switch (result)
|
||||
{
|
||||
case MessageBoxResult.Yes:
|
||||
// 覆盖现有备份文件
|
||||
File.Copy(OriginalFilePath, backupFilePath, true);
|
||||
break;
|
||||
case MessageBoxResult.No:
|
||||
// 创建带时间戳的新备份文件
|
||||
string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
|
||||
string timestampBackupPath = $"{OriginalFilePath}.{timestamp}.bak";
|
||||
File.Copy(OriginalFilePath, timestampBackupPath);
|
||||
break;
|
||||
case MessageBoxResult.Cancel:
|
||||
// 用户取消操作
|
||||
throw new OperationCanceledException("用户取消了保存操作");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 使用示例
|
||||
|
||||
### 场景1:首次保存
|
||||
- 文件:`example.drl`
|
||||
- 备份:创建`example.drl.bak`
|
||||
|
||||
### 场景2:再次保存(选择覆盖)
|
||||
- 文件:`example.drl`
|
||||
- 现有备份:`example.drl.bak`
|
||||
- 结果:覆盖`example.drl.bak`
|
||||
|
||||
### 场景3:再次保存(选择创建时间戳备份)
|
||||
- 文件:`example.drl`
|
||||
- 现有备份:`example.drl.bak`
|
||||
- 结果:创建`example.drl.20231207_091600.bak`
|
||||
|
||||
## 优势
|
||||
|
||||
1. **数据安全**:避免意外覆盖重要备份
|
||||
2. **历史保留**:可以保留多个版本的备份文件
|
||||
3. **用户控制**:用户可以根据需要选择备份策略
|
||||
4. **最小改动**:不影响现有功能,只增强备份逻辑
|
||||
5. **向后兼容**:保持原有的工作流程
|
||||
|
||||
## 未来扩展建议
|
||||
|
||||
1. **配置化**:允许用户设置默认备份策略
|
||||
2. **自动清理**:定期清理过期的备份文件
|
||||
3. **备份管理**:提供备份文件管理界面
|
||||
4. **压缩备份**:对大文件提供压缩备份选项
|
||||
|
||||
## 测试
|
||||
|
||||
可以使用`BackupTest.cs`类来测试备份功能:
|
||||
|
||||
```csharp
|
||||
BackupTest.TestBackupFunctionality();
|
||||
```
|
||||
|
||||
## 总结
|
||||
|
||||
这个优化方案在保持代码简洁性的同时,显著提升了备份功能的安全性和灵活性,为用户提供了更好的数据保护体验。
|
||||
Reference in New Issue
Block a user