AbstractRegexSignatureDetector.cs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  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 AbstractRegexSignatureDetector : IDetector
  7. {
  8. public abstract string Extension { get; }
  9. public virtual string Precondition => null;
  10. public virtual string MimeType => new MimeMapper().GetMimeFromExtension("." + Extension);
  11. public virtual List<FormatCategory> FormatCategories => GetType().GetCustomAttributes<FormatCategoryAttribute>().Select(a => a.Category).ToList();
  12. protected abstract Regex Signature { get; }
  13. public virtual bool Detect(Stream stream)
  14. {
  15. int readBufferSize = Signature.ToString().Length * 8;
  16. char[] buffer = new char[readBufferSize];
  17. var encodings = new[]
  18. {
  19. Encoding.ASCII,
  20. Encoding.UTF8,
  21. Encoding.UTF32,
  22. Encoding.Unicode,
  23. Encoding.BigEndianUnicode
  24. };
  25. foreach (var encoding in encodings)
  26. {
  27. stream.Position = 0;
  28. var reader = new StreamReader(stream, encoding, true, readBufferSize, true);
  29. reader.ReadBlock(buffer, 0, readBufferSize);
  30. if (Signature.IsMatch(new string(buffer)))
  31. {
  32. return true;
  33. }
  34. }
  35. return false;
  36. }
  37. }