怎樣計算大檔案的MD5
阿新 • • 發佈:2019-02-16
package main
import (
"crypto/md5"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"sort"
)
// MD5All讀取檔案目錄root下所有檔案,並返回從檔案路徑到檔案內容MD5值的對映。如果掃描目錄
// 出錯或者任何操作失敗,MD5All返回失敗。
func MD5All(root string) (map[string][md5.Size]byte, error) {
m := make(map[string][md5.Size]byte)
err := filepath.Walk(root, func (path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if info.IsDir() {
return nil
}
data, err := ioutil.ReadFile(path)
if err != nil {
return err
}
m[path] = md5.Sum(data)
return nil
})
if err != nil {
return nil, err
}
return m, nil
}
func main() {
// 計算指定目錄下所有檔案的MD5值,之後按照目錄名排序並列印結果
m, err := MD5All(os.Args[1])
if err != nil {
fmt.Println(err)
return
}
var paths []string
for path := range m {
paths = append (paths, path)
}
sort.Strings(paths)
for _, path := range paths {
fmt.Printf("%x %s\n", m[path], path)
}
}