-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathDirectoryDiffFileFilter.cs
More file actions
130 lines (105 loc) · 2.73 KB
/
DirectoryDiffFileFilter.cs
File metadata and controls
130 lines (105 loc) · 2.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
namespace Menees.Diffs
{
#region Using Directives
using System;
using System.Collections.Generic;
using System.IO;
#endregion
public sealed class DirectoryDiffFileFilter
{
#region Private Data Members
private readonly string concatenatedFilters;
private readonly string[] individualFilters;
private readonly bool include;
private readonly FileSystemInfoComparer comparer;
#endregion
#region Constructors
public DirectoryDiffFileFilter(string filters, bool include)
: this(filters, include, DirectoryDiff.DefaultNameComparison)
{
}
public DirectoryDiffFileFilter(string filters, bool include, StringComparison nameComparison)
{
Conditions.RequireString(filters, nameof(filters));
this.concatenatedFilters = filters;
this.include = include;
this.individualFilters = filters.Split(';');
for (int i = 0; i < this.individualFilters.Length; i++)
{
this.individualFilters[i] = this.individualFilters[i].Trim();
}
this.comparer = FileSystemInfoComparer.Get(nameComparison);
}
#endregion
#region Public Properties
public string Filters => this.concatenatedFilters;
public bool Include => this.include;
#endregion
#region Public Methods
public FileInfo[] Filter(DirectoryInfo directory)
{
// Get all the files that match the filters
List<FileInfo> files = new();
foreach (string filter in this.individualFilters)
{
FileInfo[] filterFiles = directory.GetFiles(filter);
files.AddRange(filterFiles);
}
// Sort them
files.Sort(this.comparer);
// Throw out duplicates
FileInfo? previousFile = null;
for (int i = 0; i < files.Count; /*Incremented in the loop*/)
{
FileInfo currentFile = files[i];
if (previousFile != null && this.comparer.Compare(currentFile, previousFile) == 0)
{
files.RemoveAt(i);
// Don't increment i;
}
else
{
previousFile = currentFile;
i++;
}
}
// Exclude these files if necessary
FileInfo[] result;
if (this.include)
{
result = files.ToArray();
}
else
{
FileInfo[] allFiles = directory.GetFiles();
Array.Sort(allFiles, this.comparer);
List<FileInfo> filesToInclude = new();
int numExcludes = files.Count;
int numTotal = allFiles.Length;
int e = 0;
for (int a = 0; a < numTotal; a++)
{
int compareResult = -1;
FileInfo fileA = allFiles[a];
if (e < numExcludes)
{
FileInfo fileE = files[e];
compareResult = this.comparer.Compare(fileA, fileE);
}
if (compareResult == 0)
{
// Don't put this match in the results.
e++;
}
else
{
filesToInclude.Add(fileA);
}
}
result = filesToInclude.ToArray();
}
return result;
}
#endregion
}
}