请问比较两个文件夹的重名文件怎样做比较好?

目的是在复制文件夹前先判断是否有重名文件。

比如

# copy
e:/a/b

# to
d:/a

如果存在 d:/a/b 获取重名文件,等待指示: 覆盖、跳过、重命名

我目前的做法是遍历出 e:/a/bd:/a/b 的所有文件,然后获取同名的,但大文件夹很耗时。

请问有没有更好的办法?

目前用的是go,只提供思路也行, 谢谢

阅读 3.5k
2 个回答
package main

import (
    "fmt"
    "os"
    "path/filepath"
)

func getFiles(dir string) (map[string]struct{}, error) {
    files := make(map[string]struct{})
    err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }
        if !info.IsDir() {
            files[info.Name()] = struct{}{}
        }
        return nil
    })
    return files, err
}

func checkDuplicateFiles(srcDir, destDir string) ([]string, error) {
    srcFiles, err := getFiles(srcDir)
    if err != nil {
        return nil, err
    }

    destFiles, err := getFiles(destDir)
    if err != nil {
        return nil, err
    }

    var duplicates []string
    for file := range srcFiles {
        if _, exists := destFiles[file]; exists {
            duplicates = append(duplicates, file)
        }
    }

    return duplicates, nil
}

func main() {
    srcDir := "e:/a/b"
    destDir := "d:/a/b"

    duplicates, err := checkDuplicateFiles(srcDir, destDir)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }

    if len(duplicates) > 0 {
        fmt.Println("Duplicate files:")
        for _, file := range duplicates {
            fmt.Println(file)
        }
    } else {
        fmt.Println("No duplicate files found.")
    }
}

不要遍历出所有文件的。

例如你从src复制到dsc,循环src时候判断dsc有没有同名不就行了嘛?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题