1. 计算文件 MD5 校验和
- 工具能够计算并返回文件的 MD5 校验值。
- 用户能够选择文件或目录,并生成其 MD5 校验和。
2. 文件完整性校验
- 用户输入文件的 MD5 值后,工具能验证文件是否与该 MD5 校验值一致。
- 如果一致,输出“文件校验通过”;如果不一致,输出“文件校验失败”。
3. 支持多种文件格式
- 无论文件类型大小(文本文件、图片文件、二进制文件等),工具都应支持并能计算其 MD5 值。
4. 批量处理
- 用户可以一次性选择多个文件,工具会逐个计算 MD5 值并显示结果。
5. 生成 MD5 校验文件
- 将文件的 MD5 值生成一个校验文件,以便将来验证文件的完整性。通常,这种文件包含文件名和对应的 MD5 值。
package main
import (
"crypto/md5"
"fmt"
"os"
"github.com/sqweek/dialog"
)
func main() {
for {
fmt.Println("\033[1;34m请选择操作:\033[0m")
fmt.Println("-------------------")
fmt.Println("\033[1;32m1. 计算MD5值\033[0m")
fmt.Println("\033[1;32m2. 检查MD5值\033[0m")
fmt.Println("\033[1;32m3. 退出\033[0m")
fmt.Println("-------------------")
var choice int
_, err := fmt.Scan(&choice)
if err != nil || choice < 1 || choice > 3 {
fmt.Println("无效的选择,请输入1、2或3。")
continue
}
switch choice {
case 1:
getMd5()
return
case 2:
checkIputMd5()
return
case 3:
return
}
}
}
func getMd5() {
var filePaths []string
for {
fmt.Println("请选择文件")
filePath, err := dialog.File().Filter("Text Files", "*.*").Title("选择文件").Load()
if err != nil {
fmt.Println(err)
return
}
filePaths = append(filePaths, filePath)
var continueChoice string
fmt.Print("是否继续选择文件?(y/n): ")
fmt.Scan(&continueChoice)
if continueChoice == "n" {
break
}
}
for _, filePath := range filePaths {
data, err := os.ReadFile(filePath)
if err != nil {
fmt.Println(err)
return
}
hash := md5.New()
hash.Write(data)
md5Sum := hash.Sum(nil)
md5FileName := filePath + "_md5.txt"
os.WriteFile(md5FileName, []byte(fmt.Sprintf("%x", md5Sum)), 0644)
fmt.Println("MD5值已保存到", md5FileName)
}
}
func checkIputMd5() {
var md5Value string
fmt.Print("请输入md5值: ")
fmt.Scan(&md5Value)
fmt.Println("请选择文件")
filePath, err := dialog.File().Filter("Text Files", "*.*").Title("选择文件").Load()
if err != nil {
fmt.Println(err)
return
}
data, err := os.ReadFile(filePath)
if err != nil {
fmt.Println(err)
return
}
hash := md5.New()
hash.Write(data)
md5Sum := hash.Sum(nil)
if md5Value == fmt.Sprintf("%x", md5Sum) {
fmt.Println("\033[1;32m文件校验通过\033[0m")
} else {
fmt.Println("\033[1;31m文件校验失败\033[0m")
}
}