main.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package main
  2. import (
  3. "errors"
  4. "flag"
  5. "io"
  6. "io/ioutil"
  7. "log"
  8. "os"
  9. "path/filepath"
  10. "strings"
  11. "github.com/gabriel-vasile/mimetype"
  12. )
  13. // FileSignature 定义了文件签名的结构
  14. type FileSignature struct {
  15. Signature []byte
  16. Extension string
  17. }
  18. var (
  19. dir = flag.String("dir", "/Users/taozhang/Downloads/docs2", "要处理的文件目录")
  20. )
  21. // detectFileType 通过文件的签名来识别文件类型
  22. func detectFileType(filePath string) (string, string, error) {
  23. f, err := os.Open(filePath)
  24. if err != nil {
  25. return "", "", err
  26. }
  27. defer f.Close()
  28. // 读取文件的前16字节,这应该足以检测大多数文件的类型
  29. signature := make([]byte, 64)
  30. if _, err := io.ReadFull(f, signature); err != nil {
  31. return "", "", err
  32. }
  33. // 查找匹配的签名
  34. mtype := mimetype.Detect(signature)
  35. // 如果没有匹配的签名,返回未知类型
  36. extension := mtype.Extension()
  37. mime := mtype.String()
  38. if extension == "" {
  39. return "", "", errors.New("unknow extension")
  40. } else {
  41. return extension, mime, nil
  42. }
  43. }
  44. // init
  45. func init() {
  46. flag.Parse()
  47. }
  48. // main
  49. func main() {
  50. fs, err := ioutil.ReadDir(*dir)
  51. if err != nil {
  52. log.Fatal(err)
  53. }
  54. for _, f := range fs {
  55. ext := strings.ToLower(filepath.Ext(f.Name()))
  56. newExt, mime, err := detectFileType(filepath.Join(*dir, f.Name()))
  57. if err == nil && ext != newExt {
  58. newFileName := f.Name()[:len(f.Name())-len(ext)] + newExt
  59. log.Println(f.Name(), mime, ext, newExt, newFileName)
  60. //os.Rename(filepath.Join(*dir, f.Name()), filepath.Join(*dir, newFileName))
  61. }
  62. }
  63. }