答案:该程序使用Golang比较两个文件夹内容,通过遍历目录、获取文件信息并计算哈希值,输出文件差异。具体包括列出仅存在于一个目录的文件及内容不同的文件,若完全一致则提示相同。

要比较两个文件夹内容的差异,可以使用 Golang 的 os 和 path/filepath 包遍历目录,再通过 os.Stat 获取文件信息进行比对。以下是一个简单实用的程序,能列出两个文件夹中不同的文件(包括缺失文件和内容不同的文件)。
功能说明
该程序会:递归遍历两个指定文件夹 比较文件是否存在、大小是否一致 对大小相同的文件进行内容哈希比对(避免误判) 输出哪些文件仅存在于一个文件夹,或内容不同
完整代码实现
保存为 diffdirs.go:
package mainimport (“crypto/sha256″”fmt””io””os””path/filepath”)// 计算文件的 SHA256 哈希func fileHash(path string) (string, error) {file, err := os.Open(path)if err != nil {return “”, err}defer file.Close()hash := sha256.New()_, err = io.Copy(hash, file)if err != nil {return “”, err}return fmt.Sprintf(“%x”, hash.Sum(nil)), nil}// 遍历目录,构建路径到文件信息的映射func scanDir(root string) (map[string]os.FileInfo, error) {files := make(map[string]os.FileInfo)err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {if err != nil {return err}// 相对路径作为键rel, err := filepath.Rel(root, path)if err != nil {return err}if rel == “.” {return nil}files[rel] = inforeturn nil})return files, err}// 比较两个文件夹func compareDirs(dir1, dir2 string) {files1, err1 := scanDir(dir1)files2, err2 := scanDir(dir2)if err1 != nil {fmt.Printf(“读取目录 %s 失败: %vn”, dir1, err1)return}if err2 != nil {fmt.Printf(“读取目录 %s 失败: %vn”, dir2, err2)return}fmt.Printf(“开始比较:n %sn %snn”, dir1, dir2)var onlyIn1, onlyIn2, different []string// 检查在 dir1 但不在 dir2 的文件,或内容不同for rel, info1 := range files1 {info2, exists := files2[rel]if !exists {onlyIn1 = append(onlyIn1, rel)} else {// 文件都存在,比较大小和内容if info1.Size() != info2.Size() {different = append(different, rel)} else {// 大小相同,进一步比对哈希path1 := filepath.Join(dir1, rel)path2 := filepath.Join(dir2, rel)hash1, err1 := fileHash(path1)hash2, err2 := fileHash(path2)if err1 != nil || err2 != nil || hash1 != hash2 {different = append(different, rel)}}}}// 检查在 dir2 但不在 dir1 的文件for rel := range files2 {if _, exists := files1[rel]; !exists {onlyIn2 = append(onlyIn2, rel)}}// 输出结果if len(onlyIn1) > 0 {fmt.Println(“仅存在于”, dir1+”:”)for _, f := range onlyIn1 {fmt.Println(” +”, f)}fmt.Println()}if len(onlyIn2) > 0 {fmt.Println(“仅存在于”, dir2+”:”)for _, f := range onlyIn2 {fmt.Println(” +”, f)}fmt.Println()}if len(different) > 0 {fmt.Println(“内容不同的文件:”)for _, f := range different {fmt.Println(” ≠”, f)}fmt.Println()}if len(onlyIn1) == 0 && len(onlyIn2) == 0 && len(different) == 0 {fmt.Println(“两个文件夹内容完全相同。”)}}func main() {if len(os.Args) != 3 {fmt.Println(“用法: go run diffdirs.go “)os.Exit(1)}dir1 := os.Args[1]dir2 := os.Args[2]compareDirs(dir1, dir2)}
使用方法
打开终端运行:
go run diffdirs.go /path/to/folder1 /path/to/folder2
输出示例
如果文件夹不同,输出可能如下:
立即学习“go语言免费学习笔记(深入)”;
开始比较: /tmp/folder1 /tmp/folder2仅存在于 /tmp/folder1: + docs/readme.txt仅存在于 /tmp/folder2: + temp/cache.tmp内容不同的文件: ≠ config.json
如果完全一致,会输出:“两个文件夹内容完全相同。”
基本上就这些。这个程序适合大多数基本比较场景,不依赖外部库,可扩展支持更多比对规则(如忽略某些路径、只比较修改时间等)。
以上就是用Golang编写一个程序来比较两个文件夹内容的差异的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1402559.html
微信扫一扫
支付宝扫一扫