go练习md5效验工具

139 阅读3分钟

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
		}

		// 创建MD5哈希对象
		hash := md5.New()

		// 写入数据到哈希对象
		hash.Write(data)

		// 计算MD5值
		md5Sum := hash.Sum(nil)

		// 将MD5值写入文件,文件名是原文件名加_md5.txt
		md5FileName := filePath + "_md5.txt"
		os.WriteFile(md5FileName, []byte(fmt.Sprintf("%x", md5Sum)), 0644) // 转换为十六进制字符串
		fmt.Println("MD5值已保存到", md5FileName)
	}
}

func checkIputMd5() {
	//用户输入md5值
	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
	}

	//比较用户输入md5值和文件md5值
	data, err := os.ReadFile(filePath) // 使用选择的文件路径
	if err != nil {
		fmt.Println(err)
		return
	}

	// 创建MD5哈希对象
	hash := md5.New()

	// 写入数据到哈希对象
	hash.Write(data)

	// 计算MD5值
	md5Sum := hash.Sum(nil)

	// 比较用户输入md5值和文件md5值
	if md5Value == fmt.Sprintf("%x", md5Sum) {
		fmt.Println("\033[1;32m文件校验通过\033[0m") // 使用绿色输出
	} else {
		fmt.Println("\033[1;31m文件校验失败\033[0m") // 使用红色输出
	}
}