AbstractFullRegexDetector.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using System.Reflection;
  2. using System.Text;
  3. using System.Text.RegularExpressions;
  4. using Masuit.Tools.Mime;
  5. namespace Masuit.Tools.Files.FileDetector;
  6. public abstract class AbstractFullRegexDetector : IDetector
  7. {
  8. public abstract string Extension { get; }
  9. public virtual string Precondition => "txt";
  10. protected abstract Regex Pattern { get; }
  11. public virtual string MimeType => new MimeMapper().GetMimeFromExtension("." + Extension);
  12. public virtual List<FormatCategory> FormatCategories => GetType().GetCustomAttributes<FormatCategoryAttribute>().Select(a => a.Category).ToList();
  13. public virtual bool Detect(Stream stream)
  14. {
  15. var encodings = new[]
  16. {
  17. Encoding.UTF8,
  18. Encoding.Unicode,
  19. Encoding.GetEncoding ( "utf-7" ),
  20. Encoding.GetEncoding ( "utf-32" ),
  21. Encoding.BigEndianUnicode,
  22. Encoding.GetEncoding ( "ascii" ),
  23. Encoding.GetEncoding ( "ks_c_5601-1987" ),
  24. Encoding.GetEncoding ( "iso-2022-kr" ),
  25. Encoding.GetEncoding ( "shift_jis" ),
  26. Encoding.GetEncoding ( "csISO2022JP" ),
  27. Encoding.GetEncoding ( "windows-1250" ),
  28. Encoding.GetEncoding ( "windows-1251" ),
  29. Encoding.GetEncoding ( "windows-1252" ),
  30. Encoding.GetEncoding ( "windows-1253" ),
  31. Encoding.GetEncoding ( "windows-1254" ),
  32. };
  33. foreach (var encoding in encodings)
  34. {
  35. stream.Position = 0;
  36. var reader = new StreamReader(stream, encoding, true, 4096, true);
  37. string buffer = reader.ReadToEnd();
  38. if (Pattern.Replace(buffer, "") == string.Empty)
  39. {
  40. return true;
  41. }
  42. }
  43. return false;
  44. }
  45. }