12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- package main
- import (
- "errors"
- "flag"
- "io"
- "io/ioutil"
- "log"
- "os"
- "path/filepath"
- "strings"
- "github.com/gabriel-vasile/mimetype"
- )
- // FileSignature 定义了文件签名的结构
- type FileSignature struct {
- Signature []byte
- Extension string
- }
- var (
- dir = flag.String("dir", "/Users/taozhang/Downloads/docs2", "要处理的文件目录")
- )
- // detectFileType 通过文件的签名来识别文件类型
- func detectFileType(filePath string) (string, string, error) {
- f, err := os.Open(filePath)
- if err != nil {
- return "", "", err
- }
- defer f.Close()
- // 读取文件的前16字节,这应该足以检测大多数文件的类型
- signature := make([]byte, 64)
- if _, err := io.ReadFull(f, signature); err != nil {
- return "", "", err
- }
- // 查找匹配的签名
- mtype := mimetype.Detect(signature)
- // 如果没有匹配的签名,返回未知类型
- extension := mtype.Extension()
- mime := mtype.String()
- if extension == "" {
- return "", "", errors.New("unknow extension")
- } else {
- return extension, mime, nil
- }
- }
- // init
- func init() {
- flag.Parse()
- }
- // main
- func main() {
- fs, err := ioutil.ReadDir(*dir)
- if err != nil {
- log.Fatal(err)
- }
- for _, f := range fs {
- ext := strings.ToLower(filepath.Ext(f.Name()))
- newExt, mime, err := detectFileType(filepath.Join(*dir, f.Name()))
- if err == nil && ext != newExt {
- newFileName := f.Name()[:len(f.Name())-len(ext)] + newExt
- log.Println(f.Name(), mime, ext, newExt, newFileName)
- //os.Rename(filepath.Join(*dir, f.Name()), filepath.Join(*dir, newFileName))
- }
- }
- }
|