Skip to content

Commit 15d63eb

Browse files
committed
#5 支持查找指定的文件名
1 parent bfb7e58 commit 15d63eb

File tree

5 files changed

+103
-20
lines changed

5 files changed

+103
-20
lines changed

src/Filters/OnlyFileNameFilter.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System.Collections.Generic;
2+
using System.IO;
3+
using System.Linq;
4+
5+
namespace FindDuplicateFiles.Filters
6+
{
7+
/// <summary>
8+
/// 指定文件名过滤器
9+
/// </summary>
10+
internal class OnlyFileNameFilter : IFileSearchFilter
11+
{
12+
private readonly List<string> _fileNames;
13+
/// <summary>
14+
/// 初始化过滤器
15+
/// </summary>
16+
/// <param name="fileNames">指定的文件名列表</param>
17+
public OnlyFileNameFilter(List<string> fileNames)
18+
{
19+
_fileNames = fileNames;
20+
}
21+
public List<FileInfo> FilterByCondition(List<FileInfo> files)
22+
{
23+
return files.Where(x => _fileNames.Contains(x.Name.ToLower())).ToList();
24+
}
25+
}
26+
}

src/MainWindow.xaml

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,10 @@
9696
<!-- 左侧功能面板 -->
9797
<Grid Grid.Column="0" >
9898
<Grid.RowDefinitions>
99-
<RowDefinition Height="120"></RowDefinition>
100-
<RowDefinition Height="240"></RowDefinition>
101-
<RowDefinition Height="240"></RowDefinition>
102-
<RowDefinition Height="50"></RowDefinition>
99+
<RowDefinition Height="auto"></RowDefinition>
100+
<RowDefinition Height="auto"></RowDefinition>
101+
<RowDefinition Height="auto"></RowDefinition>
102+
<RowDefinition Height="auto"></RowDefinition>
103103
</Grid.RowDefinitions>
104104

105105
<!-- 匹配方式 -->
@@ -119,7 +119,19 @@
119119
<Border BorderBrush="{DynamicResource BlockBorder}" BorderThickness="1">
120120
<StackPanel Margin="5">
121121
<TextBlock FontWeight="Bold" Foreground="{DynamicResource FontForeground}" VerticalAlignment="Center">选项</TextBlock>
122-
<CheckBox Name="ChkIgnoreEmptyFile" Foreground="{DynamicResource FontForeground}" Margin="0,2,0,5" ToolTip="不查找大小为0的文件">忽略空文件</CheckBox>
122+
<CheckBox
123+
Name="ChkOnlyFileName"
124+
Foreground="{DynamicResource FontForeground}"
125+
Margin="0,2,0,5"
126+
Checked="ChkOnlyFileName_Checked"
127+
Unchecked="ChkOnlyFileName_Unchecked"
128+
ToolTip="需要同时查找多个文件名时,用|(竖线)隔开">仅查找以下文件名(多个用|隔开)</CheckBox>
129+
<TextBox
130+
x:Name="TxtOnlyFileNames"
131+
Margin="20,0,0,5"
132+
IsEnabled="False"
133+
ToolTip="需要同时查找多个文件名时,用|(竖线)隔开"/>
134+
<CheckBox Name="ChkIgnoreEmptyFile" Foreground="{DynamicResource FontForeground}" Margin="0,0,0,5" ToolTip="不查找大小为0的文件">忽略空文件</CheckBox>
123135
<CheckBox Name="ChkIgnoreHiddenFile" Foreground="{DynamicResource FontForeground}" Margin="0,0,0,5">忽略隐藏文件</CheckBox>
124136
<CheckBox Name="ChkIgnoreSystemFile" Foreground="{DynamicResource FontForeground}" Margin="0,0,0,5">忽略系统文件</CheckBox>
125137
<CheckBox Name="ChkIgnoreSmallFile" Foreground="{DynamicResource FontForeground}" Margin="0,0,0,5">忽略小文件(小于1024KB)</CheckBox>
@@ -139,7 +151,7 @@
139151
<TextBlock FontWeight="Bold" Foreground="{DynamicResource FontForeground}" VerticalAlignment="Center">查找路径(这里也支持拖拽哦~~)</TextBlock>
140152
<ListBox Name="ListBoxSearchFolders"
141153
ItemsSource="{Binding}"
142-
Height="160"
154+
Height="140"
143155
Background="Transparent"
144156
BorderBrush="{DynamicResource BlockBorder}"
145157
Margin="0,5,0,0"

src/MainWindow.xaml.cs

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ private void InitializeSearchCondition()
7171
ChkMD5.IsChecked = true;
7272

7373
//选项
74+
ChkOnlyFileName.IsChecked = false;
7475
ChkIgnoreEmptyFile.IsChecked = true;
7576
ChkIgnoreHiddenFile.IsChecked = true;
7677
ChkIgnoreSystemFile.IsChecked = true;
@@ -260,6 +261,7 @@ private void BeginSearch()
260261

261262
//选项
262263
SearchOptionEnum searchOption = 0;
264+
var searchOptionData = new SearchOptionData();
263265
if (ChkIgnoreEmptyFile.IsChecked == true)
264266
{
265267
searchOption |= SearchOptionEnum.IgnoreEmptyFile;
@@ -288,14 +290,30 @@ private void BeginSearch()
288290
{
289291
searchOption |= SearchOptionEnum.OnlyDocumentFile;
290292
}
291-
293+
if (ChkOnlyFileName.IsChecked == true)
294+
{
295+
var onlyFileNames = TxtOnlyFileNames.Text.Trim();
296+
if (onlyFileNames.IsEmpty())
297+
{
298+
MessageBox.Show("请输入要查找的文件名", "重复文件查找", MessageBoxButton.OK, MessageBoxImage.Stop);
299+
TxtOnlyFileNames.Focus();
300+
return;
301+
}
302+
searchOptionData.OnlyFileNames = new List<string>();
303+
searchOption |= SearchOptionEnum.OnlyFileName;
304+
foreach (var onlyFileName in onlyFileNames.Split('|'))
305+
{
306+
searchOptionData.OnlyFileNames.Add(onlyFileName.Trim().ToLower());
307+
}
308+
}
292309
SetBeginSearchStyle();
293310
_myModel.DuplicateFiles.Clear();
294311
var config = new SearchConfigs()
295312
{
296313
Folders = new List<string>(_myModel.SearchDirectory.Select(x => x.DirectoryName).ToList()),
297314
SearchMatch = searchMatch,
298-
SearchOption = searchOption
315+
SearchOption = searchOption,
316+
SearchOptionData = searchOptionData
299317
};
300318
_searchFilesJob.Start(config);
301319
}
@@ -642,5 +660,16 @@ private void RadioButtonFilter_Checked(object sender, RoutedEventArgs e)
642660
duplicateFile.IsCheckedFile = true;
643661
}
644662
}
663+
664+
private void ChkOnlyFileName_Checked(object sender, RoutedEventArgs e)
665+
{
666+
TxtOnlyFileNames.IsEnabled = true;
667+
}
668+
669+
private void ChkOnlyFileName_Unchecked(object sender, RoutedEventArgs e)
670+
{
671+
TxtOnlyFileNames.Text = "";
672+
TxtOnlyFileNames.IsEnabled = false;
673+
}
645674
}
646675
}

src/Model/SearchConfigs.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public class SearchConfigs
88
public List<string> Folders { get; set; }
99
public SearchMatchEnum SearchMatch { get; set; }
1010
public SearchOptionEnum SearchOption { get; set; }
11+
public SearchOptionData SearchOptionData { get; set; }
1112
}
1213

1314
/// <summary>
@@ -34,5 +35,14 @@ public enum SearchOptionEnum
3435
OnlyMediaFile = 16,
3536
OnlyDocumentFile = 32,
3637
IgnoreSystemFile = 64,
38+
OnlyFileName = 128
39+
}
40+
41+
/// <summary>
42+
/// 查找选项的数据
43+
/// </summary>
44+
public class SearchOptionData
45+
{
46+
public List<string> OnlyFileNames { get; set; }
3747
}
3848
}

src/SearchFile/SearchFilesJob.cs

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,11 @@ public class SearchFilesJob
3535
/// </summary>
3636
public Action EventSearchFinished;
3737

38+
private SearchConfigs _searchConfig;
3839
public async void Start(SearchConfigs config)
3940
{
4041
_isStop = false;
42+
_searchConfig = config;
4143
await Task.Run(() =>
4244
{
4345
_checkDuplicateQueue = new CheckDuplicateQueue
@@ -47,12 +49,12 @@ await Task.Run(() =>
4749
EventSearchFinished = EventSearchFinished
4850
};
4951

50-
_checkDuplicateQueue.Start(config.SearchMatch);
51-
foreach (string folderPath in config.Folders)
52+
_checkDuplicateQueue.Start(_searchConfig.SearchMatch);
53+
foreach (string folderPath in _searchConfig.Folders)
5254
{
5355
EachDirectory(folderPath, paths =>
5456
{
55-
CalcFilesInfo(paths, config.SearchOption);
57+
CalcFilesInfo(paths);
5658
});
5759
}
5860

@@ -87,49 +89,53 @@ private void EachDirectory(string folderPath, Action<List<string>> callbackFileP
8789
}
8890
}
8991

90-
private void CalcFilesInfo(List<string> paths, SearchOptionEnum searchOption)
92+
private void CalcFilesInfo(List<string> paths)
9193
{
9294
EventMessage?.Invoke($"读取文件:{string.Join(",", paths)}");
9395
//根据路径加载文件信息
9496
var files = paths.Select(path => new FileInfo(path)).ToList();
9597

9698
//条件过滤器
97-
if ((searchOption & SearchOptionEnum.IgnoreEmptyFile) == SearchOptionEnum.IgnoreEmptyFile)
99+
if ((_searchConfig.SearchOption & SearchOptionEnum.IgnoreEmptyFile) == SearchOptionEnum.IgnoreEmptyFile)
98100
{
99101
IFileSearchFilter filter = new IgnoreEmptyFileFilter();
100102
files = filter.FilterByCondition(files);
101103
}
102-
if ((searchOption & SearchOptionEnum.IgnoreHiddenFile) == SearchOptionEnum.IgnoreHiddenFile)
104+
if ((_searchConfig.SearchOption & SearchOptionEnum.IgnoreHiddenFile) == SearchOptionEnum.IgnoreHiddenFile)
103105
{
104106
IFileSearchFilter filter = new IgnoreHiddenFileFilter();
105107
files = filter.FilterByCondition(files);
106108
}
107-
if ((searchOption & SearchOptionEnum.IgnoreSmallFile) == SearchOptionEnum.IgnoreSmallFile)
109+
if ((_searchConfig.SearchOption & SearchOptionEnum.IgnoreSmallFile) == SearchOptionEnum.IgnoreSmallFile)
108110
{
109111
IFileSearchFilter filter = new IgnoreSmallFileFilter(1024);
110112
files = filter.FilterByCondition(files);
111113
}
112-
if ((searchOption & SearchOptionEnum.IgnoreSystemFile) == SearchOptionEnum.IgnoreSystemFile)
114+
if ((_searchConfig.SearchOption & SearchOptionEnum.IgnoreSystemFile) == SearchOptionEnum.IgnoreSystemFile)
113115
{
114116
IFileSearchFilter filter = new IgnoreExtensionFilter(GlobalArgs.AppConfig.SystemExtension.Split(';').ToList());
115117
files = filter.FilterByCondition(files);
116118
}
117-
if ((searchOption & SearchOptionEnum.OnlyDocumentFile) == SearchOptionEnum.OnlyDocumentFile)
119+
if ((_searchConfig.SearchOption & SearchOptionEnum.OnlyDocumentFile) == SearchOptionEnum.OnlyDocumentFile)
118120
{
119121
IFileSearchFilter filter = new OnlyExtensionFilter(GlobalArgs.AppConfig.DocumentExtension.Split(';').ToList());
120122
files = filter.FilterByCondition(files);
121123
}
122-
if ((searchOption & SearchOptionEnum.OnlyImageFile) == SearchOptionEnum.OnlyImageFile)
124+
if ((_searchConfig.SearchOption & SearchOptionEnum.OnlyImageFile) == SearchOptionEnum.OnlyImageFile)
123125
{
124126
IFileSearchFilter filter = new OnlyExtensionFilter(GlobalArgs.AppConfig.ImageExtension.Split(';').ToList());
125127
files = filter.FilterByCondition(files);
126128
}
127-
if ((searchOption & SearchOptionEnum.OnlyMediaFile) == SearchOptionEnum.OnlyMediaFile)
129+
if ((_searchConfig.SearchOption & SearchOptionEnum.OnlyMediaFile) == SearchOptionEnum.OnlyMediaFile)
128130
{
129131
IFileSearchFilter filter = new OnlyExtensionFilter(GlobalArgs.AppConfig.MediaExtension.Split(';').ToList());
130132
files = filter.FilterByCondition(files);
131133
}
132-
134+
if ((_searchConfig.SearchOption & SearchOptionEnum.OnlyFileName) == SearchOptionEnum.OnlyFileName)
135+
{
136+
IFileSearchFilter filter = new OnlyFileNameFilter(_searchConfig.SearchOptionData.OnlyFileNames);
137+
files = filter.FilterByCondition(files);
138+
}
133139
files.ForEach(file =>
134140
{
135141
//符合条件的文件写入队列

0 commit comments

Comments
 (0)