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