diff --git a/GVFS/GVFS.Platform.Windows/ActiveEnumeration.cs b/GVFS/GVFS.Platform.Windows/ActiveEnumeration.cs
index 6caa10785d..675c6d1bce 100644
--- a/GVFS/GVFS.Platform.Windows/ActiveEnumeration.cs
+++ b/GVFS/GVFS.Platform.Windows/ActiveEnumeration.cs
@@ -6,10 +6,11 @@ namespace GVFS.Platform.Windows
{
public class ActiveEnumeration
{
- private static FileNamePatternMatcher doesPatternMatch = null;
+ private static FileNamePatternMatcher doesWildcardPatternMatch = null;
// Use our own enumerator to avoid having to dispose anything
private ProjectedFileInfoEnumerator fileInfoEnumerator;
+ private FileNamePatternMatcher doesPatternMatch;
private string filterString = null;
@@ -36,12 +37,13 @@ public ProjectedFileInfo Current
}
///
- /// Sets the pattern matching delegate that will be used for file name comparisons
+ /// Sets the pattern matching delegate that will be used for file name comparisons when the filter
+ /// contains wildcards.
///
/// FileNamePatternMatcher to be used by ActiveEnumeration
- public static void SetPatternMatcher(FileNamePatternMatcher patternMatcher)
+ public static void SetWildcardPatternMatcher(FileNamePatternMatcher patternMatcher)
{
- doesPatternMatch = patternMatcher;
+ doesWildcardPatternMatch = patternMatcher;
}
///
@@ -107,15 +109,31 @@ public string GetFilterString()
return this.filterString;
}
+ private static bool NameMatchesNoWildcardFilter(string name, string filter)
+ {
+ return string.Equals(name, filter, System.StringComparison.OrdinalIgnoreCase);
+ }
+
private void SaveFilter(string filter)
{
if (string.IsNullOrEmpty(filter))
{
this.filterString = string.Empty;
+ this.doesPatternMatch = null;
}
else
{
this.filterString = filter;
+
+ if (ProjFS.Utils.DoesNameContainWildCards(this.filterString))
+ {
+ this.doesPatternMatch = doesWildcardPatternMatch;
+ }
+ else
+ {
+ this.doesPatternMatch = NameMatchesNoWildcardFilter;
+ }
+
if (this.IsCurrentValid && this.IsCurrentHidden())
{
this.MoveNext();
@@ -125,7 +143,12 @@ private void SaveFilter(string filter)
private bool IsCurrentHidden()
{
- return !doesPatternMatch(this.Current.Name, this.GetFilterString());
+ if (this.doesPatternMatch == null)
+ {
+ return false;
+ }
+
+ return !this.doesPatternMatch(this.Current.Name, this.GetFilterString());
}
private void ResetEnumerator()
diff --git a/GVFS/GVFS.Platform.Windows/WindowsFileSystemVirtualizer.cs b/GVFS/GVFS.Platform.Windows/WindowsFileSystemVirtualizer.cs
index de1963b994..a5d02a6f33 100644
--- a/GVFS/GVFS.Platform.Windows/WindowsFileSystemVirtualizer.cs
+++ b/GVFS/GVFS.Platform.Windows/WindowsFileSystemVirtualizer.cs
@@ -272,11 +272,11 @@ private void InitializeEnumerationPatternMatcher()
if (projFSPatternMatchingWorks)
{
- ActiveEnumeration.SetPatternMatcher(Utils.IsFileNameMatch);
+ ActiveEnumeration.SetWildcardPatternMatcher(Utils.IsFileNameMatch);
}
else
{
- ActiveEnumeration.SetPatternMatcher(InternalFileNameMatchesFilter);
+ ActiveEnumeration.SetWildcardPatternMatcher(InternalFileNameMatchesFilter);
}
this.Context.Tracer.RelatedEvent(
diff --git a/GVFS/GVFS.UnitTests.Windows/Windows/Virtualization/ActiveEnumerationTests.cs b/GVFS/GVFS.UnitTests.Windows/Windows/Virtualization/ActiveEnumerationTests.cs
index f74f42815c..28e7de98f1 100644
--- a/GVFS/GVFS.UnitTests.Windows/Windows/Virtualization/ActiveEnumerationTests.cs
+++ b/GVFS/GVFS.UnitTests.Windows/Windows/Virtualization/ActiveEnumerationTests.cs
@@ -23,7 +23,7 @@ public class ActiveEnumerationTests
public ActiveEnumerationTests(PatternMatcherWrapper wrapper)
{
- ActiveEnumeration.SetPatternMatcher(wrapper.Matcher);
+ ActiveEnumeration.SetWildcardPatternMatcher(wrapper.Matcher);
}
public static object[] Runners