第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

查找目錄中的重復(fù)文件

查找目錄中的重復(fù)文件

Go
阿波羅的戰(zhàn)車 2023-04-17 16:31:26
這是我的第一個(gè) Go 程序。我正在學(xué)習(xí)這門語言,但理解所有概念有點(diǎn)困難,所以為了練習(xí)我寫了一個(gè)代碼來檢測相同的文件。這是一個(gè)簡單的程序,可以遞歸地檢查目錄中的重復(fù)文件。但:如何檢測目錄文件中的重復(fù)文件問題不是遞歸目錄。問題是如何比較
查看完整描述

2 回答

?
繁花如伊

TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個(gè)贊

您可以獲取每個(gè)文件主體的哈希值,然后比較字典/映射中的哈希值。


package main


import (

    "crypto/md5"

    "fmt"

    "io"

    "io/ioutil"

    "log"

    "os"

)


func main() {

    contentHashes := make(map[string]string)

    if err := readDir("./", contentHashes); err != nil {

        log.Fatal(err)

    }

}


func readDir(dirName string, contentHashes map[string]string) (err error) {

    filesInfos, err := ioutil.ReadDir(dirName)

    if err != nil {

        return

    }

    for _, fi := range filesInfos {

        if fi.IsDir() {

            err := readDir(dirName+fi.Name()+"/", contentHashes)

            if err != nil {

                return err

            }

        } else {

            // The important bits for this question

            location := dirName + fi.Name()

            // open the file

            f, err := os.Open(location)

            if err != nil {

                return err

            }

            h := md5.New()

            // copy the file body into the hash function

            if _, err := io.Copy(h, f); err != nil {

                return err

            }

            // Check if a file body with the same hash already exists

            key := fmt.Sprintf("%x", h.Sum(nil))

            if val, exists := contentHashes[key]; exists {

                fmt.Println("Duplicate found", val, location)

            } else {

                contentHashes[key] = location

            }

        }

    }

    return

}


查看完整回答
反對 回復(fù) 2023-04-17
?
肥皂起泡泡

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超6個(gè)贊

使用 sha256 比較文件


例子:


package main


import (

    "crypto/sha256"

    "encoding/hex"

    "fmt"

    "os"

    "path/filepath"

    "sync"

    "flag"

    "runtime"

    "io"

)


var dir string

var workers int


type Result struct {

    file   string

    sha256 [32]byte

}


func worker(input chan string, results chan<- *Result, wg *sync.WaitGroup) {

    for file := range input {

        var h = sha256.New()

        var sum [32]byte

        f, err := os.Open(file)

        if err != nil {

            fmt.Fprintln(os.Stderr, err)

            continue

        }

        if _, err = io.Copy(h, f); err != nil {

            fmt.Fprintln(os.Stderr, err)

            f.Close()

            continue

        }

        f.Close()

        copy(sum[:], h.Sum(nil))

        results <- &Result{

            file:   file,

            sha256: sum,

        }

    }

    wg.Done()

}


func search(input chan string) {

    filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {

        if err != nil {

            fmt.Fprintln(os.Stderr, err)

        } else if info.Mode().IsRegular() {

            input <- path

        }

        return nil

    })

    close(input)

}


func main() {


    flag.StringVar(&dir, "dir", ".", "directory to search")

    flag.IntVar(&workers, "workers", runtime.NumCPU(), "number of workers")

    flag.Parse()


    fmt.Printf("Searching in %s using %d workers...\n", dir, workers)


    input := make(chan string)

    results := make(chan *Result)


    wg := sync.WaitGroup{}

    wg.Add(workers)


    for i := 0; i < workers; i++ {

        go worker(input, results, &wg)

    }


    go search(input)

    go func() {

        wg.Wait()

        close(results)

    }()


    counter := make(map[[32]byte][]string)

    for result := range results {

        counter[result.sha256] = append(counter[result.sha256], result.file)

    }


    for sha, files := range counter {

        if len(files) > 1 {

            fmt.Printf("Found %d duplicates for %s: \n", len(files), hex.EncodeToString(sha[:]))

            for _, f := range files {

                fmt.Println("-> ", f)

            }

        }

    }


}


查看完整回答
反對 回復(fù) 2023-04-17
  • 2 回答
  • 0 關(guān)注
  • 164 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號