Skip to content

Instantly share code, notes, and snippets.

@kedare kedare/sum.go
Last active May 8, 2016

Embed
What would you like to do?
package main
import (
"crypto/sha256"
"encoding/hex"
"io/ioutil"
"os"
"sync"
"github.com/fatih/color"
)
var wg sync.WaitGroup
// HashResult represents the result of a single file checksum
type HashResult struct {
Result string
Error error
}
// PrintFileHash get the checksum of the fileName file
// and show it's result or the related error
func PrintFileHash(fileName string, c chan HashResult) HashResult {
defer wg.Done()
green := color.New(color.FgGreen)
red := color.New(color.FgRed)
hasher := sha256.New()
fileContent, err := ioutil.ReadFile(fileName)
result := HashResult{}
if err != nil {
result = HashResult{Result: "", Error: err}
c <- result
} else {
hasher.Write(fileContent)
result = HashResult{Result: hex.EncodeToString(hasher.Sum(nil)), Error: nil}
}
if result.Error != nil {
red.Println("KO > " + fileName + " - " + result.Error.Error())
} else {
green.Println("OK > " + fileName + " - " + result.Result)
}
c <- result
return result
}
// HashAll analyze a directory and start a checksum of all the files resursively (if resursive is true)
// When the basePath is a file, only the file hash is computed
func HashAll(basePath string, recursive bool) {
basePathInfo, _ := os.Stat(basePath)
if basePathInfo.IsDir() {
files, _ := ioutil.ReadDir(basePath)
for _, file := range files {
fullPath := basePath + "/" + file.Name()
if !file.IsDir() && recursive {
c := make(chan HashResult, 1)
wg.Add(1)
go PrintFileHash(fullPath, c)
} else {
HashAll(fullPath, false)
}
}
} else {
c := make(chan HashResult, 1)
wg.Add(1)
go PrintFileHash(basePath, c)
}
}
func main() {
HashAll(os.Args[1], true)
wg.Wait()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.