FileSearchComparer.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Security.Cryptography.X509Certificates;
  4. namespace Quadarax.Foundation.Core.IO
  5. {
  6. public class FileSearchComparer
  7. {
  8. private IEnumerable<string> _includePatterns;
  9. private IEnumerable<string> _excludePatterns;
  10. public FileSearchComparer(IEnumerable<string> includePatterns, IEnumerable<string> excludePatterns)
  11. {
  12. _includePatterns = includePatterns ?? throw new ArgumentNullException(nameof(includePatterns));
  13. _excludePatterns = excludePatterns ?? throw new ArgumentNullException(nameof(excludePatterns));
  14. }
  15. public bool Match(string fullFilePath)
  16. {
  17. var result = false;
  18. foreach (var inclPat in _includePatterns)
  19. {
  20. if (MatchInternal(fullFilePath, inclPat))
  21. {
  22. result = true;
  23. break;
  24. }
  25. }
  26. foreach (var exclPat in _excludePatterns)
  27. {
  28. if (MatchInternal(fullFilePath, exclPat))
  29. {
  30. result = false;
  31. break;
  32. }
  33. }
  34. return result;
  35. }
  36. private bool MatchInternal(string fullFilePath, string pattern)
  37. {
  38. if (string.IsNullOrEmpty(fullFilePath) && pattern == "*")
  39. return true;
  40. if (pattern == "*")
  41. return true;
  42. if (string.IsNullOrEmpty(fullFilePath))
  43. return false;
  44. var inputChrs = fullFilePath.ToCharArray();
  45. var patternChrs = pattern.ToCharArray();
  46. var c = 0;
  47. for (var i = c; i< patternChrs.Length; i++)
  48. {
  49. if (i - 1 >= 0 && pattern[i-1] == '*')
  50. {
  51. c = Array.IndexOf(inputChrs,pattern[i], c);
  52. if (c == -1)
  53. return false;
  54. }
  55. if (pattern[i] == inputChrs[c])
  56. {
  57. if (c < i)
  58. c = i;
  59. else
  60. c++;
  61. continue;
  62. }
  63. if (pattern[i] != '*')
  64. return false;
  65. }
  66. return true;
  67. }
  68. }
  69. }