Skip to content

Commit 8bd2af8

Browse files
committed
v3.3.4.2
新增恢复备份的方式 优化备份恢复速度
1 parent 3a9be48 commit 8bd2af8

File tree

4 files changed

+111
-54
lines changed

4 files changed

+111
-54
lines changed

ContextMenuManager/Controls/BackupBox.cs

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,24 @@ public BackupBox()
3737
VisibleChanged += (sender, e) => this.SetEnabled(Visible);
3838
Backup.Click += (sender, e) => {
3939
Cursor = Cursors.WaitCursor;
40-
helper.BackupItems(BackupList.BackupMode.Basic);
40+
helper.BackupItems(BackupList.BackupTarget.Basic);
4141
Cursor = Cursors.Default;
4242
MessageBox("备份完成!", "备份");
4343
};
4444
Restore.Click += (sender, e) => {
45-
UpdateRestoreFileList();
46-
using (RestoreListDialog dlg = new RestoreListDialog())
45+
if (UpdateRestoreFileList())
4746
{
48-
dlg.BackupBox = this;
49-
dlg.RestoreList = restoreFileList;
50-
dlg.ShowDialog();
51-
};
47+
using (RestoreListDialog dlg = new RestoreListDialog())
48+
{
49+
dlg.BackupBox = this;
50+
dlg.RestoreList = restoreFileList;
51+
dlg.ShowDialog();
52+
};
53+
}
54+
else
55+
{
56+
MessageBox("不存在任何备份!", "备份");
57+
}
5258
};
5359
ResumeLayout();
5460
}
@@ -76,17 +82,17 @@ protected override void OnResize(EventArgs e)
7682
Restore.Left = Backup.Right + margin;
7783
}
7884

79-
public void RestoreItems(int restoreIndex)
85+
public void RestoreItems(int restoreFilePathIndex, int restoreModeIndex)
8086
{
81-
if (restoreIndex == -1) return;
87+
if (restoreFilePathIndex == -1) return;
8288
Cursor = Cursors.WaitCursor;
83-
BackupList.ReadBackupList(restoreFileList[restoreIndex].FilePath);
84-
helper.RestoreItems(BackupList.BackupMode.Basic);
89+
helper.RestoreItems(BackupList.BackupTarget.Basic, restoreFileList[restoreFilePathIndex].FilePath,
90+
restoreModeIndex == 0 ? BackupList.RestoreMode.EnableDiableOnList : BackupList.RestoreMode.JustEnableOnList);
8591
Cursor = Cursors.Default;
8692
MessageBox("恢复完成!", "恢复");
8793
}
8894

89-
private void UpdateRestoreFileList()
95+
private bool UpdateRestoreFileList()
9096
{
9197
restoreFileList.Clear();
9298
string rootPath = AppConfig.MenuBackupRootDir;
@@ -116,6 +122,9 @@ private void UpdateRestoreFileList()
116122
});
117123
}
118124
}
125+
126+
// 如果存在备份返回true
127+
return restoreFileList.Count > 0;
119128
}
120129

121130
class RestoreFileItem
@@ -182,16 +191,24 @@ public RestoreListForm()
182191
dgvRestore.ColumnHeadersDefaultCellStyle.Alignment
183192
= dgvRestore.RowsDefaultCellStyle.Alignment
184193
= DataGridViewContentAlignment.BottomCenter;
185-
Controls.AddRange(new Control[] { dgvRestore, lblConfirm });
194+
Controls.AddRange(new Control[] { dgvRestore, lblBackupMode, cmbBackupMode, lblConfirm });
195+
cmbBackupMode.Items.AddRange(new[] { "不处理不存在于备份列表上的菜单项", "仅启用备份列表上可见的菜单项" });
196+
cmbBackupMode.Width = 200.DpiZoom();
197+
cmbBackupMode.DropDownStyle = ComboBoxStyle.DropDownList;
198+
cmbBackupMode.AutosizeDropDownWidth();
199+
cmbBackupMode.SelectedIndex = 0;
186200
lblConfirm.MouseEnter += (sender, e) => lblConfirm.ForeColor = Color.FromArgb(0, 162, 255);
187-
lblConfirm.MouseLeave += (sender, e) => lblConfirm.ForeColor = Color.DimGray;
201+
lblConfirm.MouseLeave += (sender, e) => lblConfirm.ForeColor = Color.Black;
188202
lblConfirm.Click += (sender, e) => {
189-
int restoreIndex = GetSelectedRowIndex(dgvRestore);
190-
BackupBox.RestoreItems(restoreIndex);
203+
int restoreFilePathIndex = GetSelectedRowIndex(dgvRestore);
204+
int restoreModeIndex = cmbBackupMode.SelectedIndex;
205+
BackupBox.RestoreItems(restoreFilePathIndex, restoreModeIndex);
191206
};
192207
this.AddEscapeButton();
193208
}
194209

210+
readonly ComboBox cmbBackupMode = new ComboBox();
211+
195212
readonly DataGridView dgvRestore = new DataGridView
196213
{
197214
ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize,
@@ -206,6 +223,12 @@ public RestoreListForm()
206223
ReadOnly = true
207224
};
208225

226+
readonly Label lblBackupMode = new Label
227+
{
228+
Text = "恢复方式:",
229+
AutoSize = true,
230+
};
231+
209232
readonly Label lblConfirm = new Label
210233
{
211234
Text = "确定",
@@ -217,11 +240,14 @@ protected override void OnResize(EventArgs e)
217240
{
218241
base.OnResize(e);
219242
int margin = 20.DpiZoom();
243+
int a = 6.DpiZoom();
220244
dgvRestore.Location = new Point(margin, margin);
221245
dgvRestore.Width = ClientSize.Width - 2 * margin;
222246
dgvRestore.Height = ClientSize.Height - 3 * margin - lblConfirm.Height;
223-
lblConfirm.Top = dgvRestore.Bottom + margin;
224-
lblConfirm.Left = (ClientSize.Width - lblConfirm.Width) / 2;
247+
lblBackupMode.Top = cmbBackupMode.Top = lblConfirm.Top = dgvRestore.Bottom + margin;
248+
lblBackupMode.Left = margin;
249+
cmbBackupMode.Left = lblBackupMode.Right + a;
250+
lblConfirm.Left = ClientSize.Width - margin - lblConfirm.Width;
225251
}
226252

227253
public void ShowRestoreList(List<RestoreFileItem> restoreFileItems)

ContextMenuManager/Methods/BackupHelper.cs

Lines changed: 39 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -18,34 +18,39 @@ namespace ContextMenuManager.Methods
1818
internal class BackupHelper
1919
{
2020
private Scenes currentScene;
21-
private List<BackupItem> currentRestoreItems = new List<BackupItem>();
21+
private RestoreMode restoreMode;
2222

23-
public void BackupItems(BackupMode mode)
23+
public void BackupItems(BackupTarget mode)
2424
{
25+
ClearBackupList();
2526
string date = DateTime.Today.ToString("yyyy-MM-dd");
2627
string time = DateTime.Now.ToString("HH-mm-ss");
2728
string filePath = $@"{AppConfig.MenuBackupDir}\{date} {time}.xml";
29+
// 加载备份文件到缓冲区
2830
BackupRestoreItems(mode, true);
29-
if (!Directory.Exists($@"{AppConfig.MenuBackupDir}"))
30-
{
31-
Directory.CreateDirectory($@"{AppConfig.MenuBackupDir}");
32-
}
31+
// 保存缓冲区的备份文件
3332
SaveBackupList(filePath);
34-
ClearItems();
33+
ClearBackupList();
3534
}
3635

37-
public void RestoreItems(BackupMode mode)
36+
public void RestoreItems(BackupTarget mode, string filePath, RestoreMode restoreMode)
3837
{
38+
ClearBackupList();
39+
// 初始化恢复模式
40+
this.restoreMode = restoreMode;
41+
// 加载备份文件到缓冲区
42+
LoadBackupList(filePath);
43+
// 还原缓冲区的备份文件
3944
BackupRestoreItems(mode, false);
40-
ClearItems();
45+
ClearBackupList();
4146
}
4247

43-
private void BackupRestoreItems(BackupMode mode, bool backup)
48+
private void BackupRestoreItems(BackupTarget mode, bool backup)
4449
{
4550
Scenes[] scenes = null;
4651
switch (mode)
4752
{
48-
case BackupMode.Basic:
53+
case BackupTarget.Basic:
4954
scenes = new Scenes[] {
5055
Scenes.File, Scenes.Folder, Scenes.Directory, Scenes.Background, Scenes.Desktop,
5156
Scenes.Drive, Scenes.AllObjects, Scenes.Computer, Scenes.RecycleBin, Scenes.Library
@@ -54,35 +59,40 @@ private void BackupRestoreItems(BackupMode mode, bool backup)
5459
for (int i = 0; i < scenes.Length; i++)
5560
{
5661
currentScene = scenes[i];
57-
// 通过Scene筛选目前恢复项目
62+
// 加载某个Scene的恢复列表
5863
if (!backup)
5964
{
60-
currentRestoreItems.Clear();
61-
foreach(BackupItem item in backupList)
62-
{
63-
if (item.BackupScene == currentScene)
64-
{
65-
currentRestoreItems.Add(item);
66-
}
67-
}
65+
LoadTempRestoreList(currentScene);
6866
}
6967
GetBackupItems(backup);
7068
}
7169
}
7270

73-
private bool IfItemNeedChange(string keyName, BackupItemType itemType, bool itemVisible)
71+
private bool CheckItemNeedChange(string keyName, BackupItemType itemType, bool itemVisible)
7472
{
75-
foreach(BackupItem item in currentRestoreItems)
73+
foreach(BackupItem item in tempRestoreList)
7674
{
75+
// 成功匹配到后的处理方式
7776
if(item.KeyName == keyName && item.ItemType == itemType)
7877
{
7978
if (item.ItemVisible != itemVisible)
8079
{
8180
return true;
8281
}
82+
else
83+
{
84+
return false;
85+
}
8386
}
8487
}
85-
return false;
88+
switch(restoreMode)
89+
{
90+
case RestoreMode.JustEnableOnList:
91+
return itemVisible;
92+
case RestoreMode.EnableDiableOnList:
93+
default:
94+
return false;
95+
}
8696
}
8797

8898
private void GetBackupItems(bool backup)
@@ -145,7 +155,7 @@ private void GetBackupItems(bool backup)
145155
else
146156
{
147157
// 恢复备份列表
148-
if (IfItemNeedChange(valueName, BackupItemType.VisibleRegRuleItem, ifItemInMenu))
158+
if (CheckItemNeedChange(valueName, BackupItemType.VisibleRegRuleItem, ifItemInMenu))
149159
{
150160
item.ItemVisible = !ifItemInMenu;
151161
}
@@ -173,7 +183,7 @@ private void GetBackupItems(bool backup)
173183
else
174184
{
175185
// 恢复备份列表
176-
if (IfItemNeedChange(valueName, BackupItemType.VisibleRegRuleItem, ifItemInMenu))
186+
if (CheckItemNeedChange(valueName, BackupItemType.VisibleRegRuleItem, ifItemInMenu))
177187
{
178188
item.ItemVisible = !ifItemInMenu;
179189
}
@@ -202,7 +212,7 @@ private void GetBackupItems(bool backup)
202212
else
203213
{
204214
// 恢复备份列表
205-
if (IfItemNeedChange(valueName, BackupItemType.VisibleRegRuleItem, ifItemInMenu))
215+
if (CheckItemNeedChange(valueName, BackupItemType.VisibleRegRuleItem, ifItemInMenu))
206216
{
207217
item.ItemVisible = !ifItemInMenu;
208218
}
@@ -270,7 +280,7 @@ private void GetBackupShellItems(string shellPath, bool backup)
270280
else
271281
{
272282
// 恢复备份列表
273-
if (IfItemNeedChange(keyName, BackupItemType.ShellItem, ifItemInMenu))
283+
if (CheckItemNeedChange(keyName, BackupItemType.ShellItem, ifItemInMenu))
274284
{
275285
item.ItemVisible = !ifItemInMenu;
276286
}
@@ -337,7 +347,7 @@ private void GetBackupShellExItems(string shellExPath, bool backup)
337347
else
338348
{
339349
// 恢复备份列表
340-
if (IfItemNeedChange(keyName, BackupItemType.ShellExItem, ifItemInMenu))
350+
if (CheckItemNeedChange(keyName, BackupItemType.ShellExItem, ifItemInMenu))
341351
{
342352
item.ItemVisible = !ifItemInMenu;
343353
}
@@ -392,7 +402,7 @@ private void GetBackupUwpModeItem(bool backup)
392402
else
393403
{
394404
// 恢复备份列表
395-
if (IfItemNeedChange(itemName, BackupItemType.UwpModelItem, ifItemInMenu))
405+
if (CheckItemNeedChange(itemName, BackupItemType.UwpModelItem, ifItemInMenu))
396406
{
397407
uwpItem.ItemVisible = !ifItemInMenu;
398408
}

ContextMenuManager/Models/BackupList.cs

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ namespace ContextMenuManager.Models
1414
public static class BackupList
1515
{
1616
// 备份列表缓存区
17-
public static List<BackupItem> backupList = new List<BackupItem>();
17+
private static List<BackupItem> backupList = new List<BackupItem>();
18+
19+
// 恢复列表暂存区
20+
public static List<BackupItem> tempRestoreList = new List<BackupItem>();
1821

1922
// 创建一个XmlSerializer对象
2023
private static readonly XmlSerializer serializer = new XmlSerializer(typeof(List<BackupItem>));
@@ -24,11 +27,17 @@ public enum BackupItemType
2427
ShellItem, ShellExItem, UwpModelItem, VisibleRegRuleItem
2528
}
2629

27-
public enum BackupMode
30+
public enum BackupTarget
2831
{
2932
Basic
3033
};
3134

35+
public enum RestoreMode
36+
{
37+
EnableDiableOnList, // 启用备份列表上可见的菜单项,禁用备份列表上不可见的菜单项,不处理不存在于备份列表上的菜单项
38+
JustEnableOnList, // 仅启用备份列表上可见的菜单项,禁用备份列表上不可见以及不存在于备份列表上的菜单项
39+
};
40+
3241
static BackupList() { }
3342

3443
public static void AddItem(string keyName, BackupItemType backupItemType, bool itemVisible, Scenes scene)
@@ -42,7 +51,7 @@ public static void AddItem(string keyName, BackupItemType backupItemType, bool i
4251
});
4352
}
4453

45-
public static void ClearItems()
54+
public static void ClearBackupList()
4655
{
4756
backupList.Clear();
4857
}
@@ -56,15 +65,27 @@ public static void SaveBackupList(string filePath)
5665
}
5766
}
5867

59-
public static void ReadBackupList(string filePath)
68+
public static void LoadBackupList(string filePath)
6069
{
61-
ClearItems();
6270
// 反序列化到List<BackupItem>对象
6371
using (StreamReader sr = new StreamReader(filePath))
6472
{
6573
backupList = serializer.Deserialize(sr) as List<BackupItem>;
6674
}
6775
}
76+
77+
public static void LoadTempRestoreList(Scenes scene)
78+
{
79+
tempRestoreList.Clear();
80+
// 根据backupScene加载列表
81+
foreach (BackupItem item in backupList)
82+
{
83+
if (item.BackupScene == scene)
84+
{
85+
tempRestoreList.Add(item);
86+
}
87+
}
88+
}
6889
}
6990

7091
// 定义一个类来表示BackupItem

ContextMenuManager/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@
1111
[assembly: AssemblyCulture("")]
1212
[assembly: ComVisible(false)]
1313
[assembly: Guid("35190ec1-2515-488d-a2e9-825d6ff67aa2")]
14-
[assembly: AssemblyVersion("3.3.4.0")]
15-
[assembly: AssemblyFileVersion("3.3.4.0")]
14+
[assembly: AssemblyVersion("3.3.4.2")]
15+
[assembly: AssemblyFileVersion("3.3.4.2")]

0 commit comments

Comments
 (0)