124 lines
3.7 KiB
Markdown
124 lines
3.7 KiB
Markdown
# 备份功能优化说明
|
||
|
||
## 问题描述
|
||
|
||
原始的"应用并保存"功能在创建备份文件时,如果`.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();
|
||
```
|
||
|
||
## 总结
|
||
|
||
这个优化方案在保持代码简洁性的同时,显著提升了备份功能的安全性和灵活性,为用户提供了更好的数据保护体验。 |