首页 > 后端开发 > Golang > 正文

用Golang编写一个程序来比较两个文件夹内容的差异

P粉602998670
发布: 2025-09-02 09:37:01
原创
274人浏览过
答案:该程序使用Golang比较两个文件夹内容,通过遍历目录、获取文件信息并计算哈希值,输出文件差异。具体包括列出仅存在于一个目录的文件及内容不同的文件,若完全一致则提示相同。

用golang编写一个程序来比较两个文件夹内容的差异

要比较两个文件夹内容的差异,可以使用 Golang 的 ospath/filepath 包遍历目录,再通过 os.Stat 获取文件信息进行比对。以下是一个简单实用的程序,能列出两个文件夹中不同的文件(包括缺失文件和内容不同的文件)。

功能说明

该程序会:
  • 递归遍历两个指定文件夹
  • 比较文件是否存在、大小是否一致
  • 对大小相同的文件进行内容哈希比对(避免误判)
  • 输出哪些文件仅存在于一个文件夹,或内容不同

完整代码实现

保存为 diffdirs.go

package main import ( "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] = info return nil }) return files, err } // 比较两个文件夹 func compareDirs(dir1, dir2 string) { files1, err1 := scanDir(dir1) files2, err2 := scanDir(dir2) if err1 != nil { fmt.Printf("读取目录 %s 失败: %v\n", dir1, err1) return } if err2 != nil { fmt.Printf("读取目录 %s 失败: %v\n", dir2, err2) return } fmt.Printf("开始比较:\n %s\n %s\n\n", 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

输出示例

如果文件夹不同,输出可能如下:

DeepBrain
DeepBrain

AI视频生成工具,ChatGPT +生成式视频AI =你可以制作伟大的视频!

DeepBrain 94
查看详情 DeepBrain

立即学习go语言免费学习笔记(深入)”;

开始比较: /tmp/folder1 /tmp/folder2 仅存在于 /tmp/folder1: + docs/readme.txt 仅存在于 /tmp/folder2: + temp/cache.tmp 内容不同的文件: ≠ config.json

如果完全一致,会输出:“两个文件夹内容完全相同。”

基本上就这些。这个程序适合大多数基本比较场景,不依赖外部库,可扩展支持更多比对规则(如忽略某些路径、只比较修改时间等)。

以上就是用Golang编写一个程序来比较两个文件夹内容的差异的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号