AbstractRegexSignatureDetector.cs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using System.Collections.Generic;
  2. using System.IO;
  3. using System.Linq;
  4. using System.Reflection;
  5. using System.Text;
  6. using System.Text.RegularExpressions;
  7. using Masuit.Tools.Mime;
  8. namespace Masuit.Tools.Files.FileDetector;
  9. public abstract class AbstractRegexSignatureDetector : IDetector
  10. {
  11. public abstract string Extension { get; }
  12. public virtual string Precondition => null;
  13. public virtual string MimeType => new MimeMapper().GetMimeFromExtension("." + Extension);
  14. public virtual List<FormatCategory> FormatCategories => GetType().GetCustomAttributes<FormatCategoryAttribute>().Select(a => a.Category).ToList();
  15. protected abstract Regex Signature { get; }
  16. public virtual bool Detect(Stream stream)
  17. {
  18. int readBufferSize = Signature.ToString().Length * 8;
  19. char[] buffer = new char[readBufferSize];
  20. var encodings = new[]
  21. {
  22. Encoding.ASCII,
  23. Encoding.UTF8,
  24. Encoding.UTF32,
  25. Encoding.Unicode,
  26. Encoding.BigEndianUnicode
  27. };
  28. foreach (var encoding in encodings)
  29. {
  30. stream.Position = 0;
  31. using StreamReader reader = new StreamReader(stream, encoding, true, readBufferSize, true);
  32. reader.ReadBlock(buffer, 0, readBufferSize);
  33. if (Signature.IsMatch(new string(buffer)))
  34. {
  35. return true;
  36. }
  37. }
  38. return false;
  39. }
  40. }