|
@@ -17,7 +17,6 @@ import (
|
|
|
|
|
|
// Fdhashes struct for holding all informations about one folder.
|
|
// Fdhashes struct for holding all informations about one folder.
|
|
type Fdhashes struct {
|
|
type Fdhashes struct {
|
|
- Path string
|
|
|
|
Hashes map[string]string
|
|
Hashes map[string]string
|
|
}
|
|
}
|
|
|
|
|
|
@@ -25,6 +24,13 @@ var hashes map[string]Fdhashes
|
|
|
|
|
|
var wg sync.WaitGroup
|
|
var wg sync.WaitGroup
|
|
var mu sync.RWMutex
|
|
var mu sync.RWMutex
|
|
|
|
+var driveLetter string
|
|
|
|
+
|
|
|
|
+var rewrite bool
|
|
|
|
+
|
|
|
|
+func init() {
|
|
|
|
+ flag.BoolVar(&rewrite, "rewrite", false, "rewrite all fhhashes files.")
|
|
|
|
+}
|
|
|
|
|
|
func main() {
|
|
func main() {
|
|
log.Println("starting GoHash")
|
|
log.Println("starting GoHash")
|
|
@@ -38,9 +44,13 @@ func main() {
|
|
}
|
|
}
|
|
if file.IsDir() {
|
|
if file.IsDir() {
|
|
log.Println("start with folder:", myFile)
|
|
log.Println("start with folder:", myFile)
|
|
|
|
+ driveLetter = ""
|
|
|
|
+ if runtime.GOOS == "windows" {
|
|
|
|
+ driveLetter = filepath.VolumeName(myFile) + "/"
|
|
|
|
+ }
|
|
processFolder(myFile)
|
|
processFolder(myFile)
|
|
} else {
|
|
} else {
|
|
- log.Printf("file %s has hash %s\n", myFile, getHash(myFile))
|
|
|
|
|
|
+ log.Printf("file %s has hash %s\n", myFile, getSha256Hash(myFile))
|
|
}
|
|
}
|
|
|
|
|
|
fmt.Println("waiting")
|
|
fmt.Println("waiting")
|
|
@@ -48,7 +58,7 @@ func main() {
|
|
log.Println("done")
|
|
log.Println("done")
|
|
}
|
|
}
|
|
|
|
|
|
-func getHash(fileStr string) string {
|
|
|
|
|
|
+func getSha256Hash(fileStr string) string {
|
|
f, err := os.Open(fileStr)
|
|
f, err := os.Open(fileStr)
|
|
if err != nil {
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
log.Fatal(err)
|
|
@@ -66,7 +76,6 @@ func outputHash(fileStr string) {
|
|
var hashFile Fdhashes
|
|
var hashFile Fdhashes
|
|
doHash := true
|
|
doHash := true
|
|
defer wg.Done()
|
|
defer wg.Done()
|
|
- fmt.Print(".")
|
|
|
|
dir, fileName := filepath.Split(fileStr)
|
|
dir, fileName := filepath.Split(fileStr)
|
|
if fileName == ".fdhashes3" {
|
|
if fileName == ".fdhashes3" {
|
|
return
|
|
return
|
|
@@ -76,12 +85,12 @@ func outputHash(fileStr string) {
|
|
if !ok {
|
|
if !ok {
|
|
_, err := os.Stat(dir + ".fdhashes3")
|
|
_, err := os.Stat(dir + ".fdhashes3")
|
|
if os.IsNotExist(err) {
|
|
if os.IsNotExist(err) {
|
|
- hashFile = Fdhashes{Path: dir, Hashes: make(map[string]string)}
|
|
|
|
|
|
+ hashFile = Fdhashes{Hashes: make(map[string]string)}
|
|
} else {
|
|
} else {
|
|
hashFile = loadHashfile(dir + ".fdhashes3")
|
|
hashFile = loadHashfile(dir + ".fdhashes3")
|
|
}
|
|
}
|
|
hashes[dir] = hashFile
|
|
hashes[dir] = hashFile
|
|
- saveHashfile(hashFile)
|
|
|
|
|
|
+ saveHashfile(hashFile, dir)
|
|
}
|
|
}
|
|
|
|
|
|
_, ok = hashFile.Hashes[fileName]
|
|
_, ok = hashFile.Hashes[fileName]
|
|
@@ -89,20 +98,36 @@ func outputHash(fileStr string) {
|
|
hashFile = hashes[dir]
|
|
hashFile = hashes[dir]
|
|
mu.Unlock()
|
|
mu.Unlock()
|
|
if doHash {
|
|
if doHash {
|
|
- hash := getHash(fileStr)
|
|
|
|
|
|
+ hash := getSha256Hash(fileStr)
|
|
mu.Lock()
|
|
mu.Lock()
|
|
hashFile.Hashes[fileName] = hash
|
|
hashFile.Hashes[fileName] = hash
|
|
- saveHashfile(hashFile)
|
|
|
|
|
|
+ saveHashfile(hashFile, dir)
|
|
mu.Unlock()
|
|
mu.Unlock()
|
|
- log.Printf("file %s has hash %s\n", fileStr, hash)
|
|
|
|
|
|
+ log.Printf("file \"%s\" has hash \"%s\"\n", fileStr, hash)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+var count int
|
|
|
|
+
|
|
func processFolder(folder string) {
|
|
func processFolder(folder string) {
|
|
|
|
+ count = 0
|
|
err := filepath.Walk(folder, func(path string, info os.FileInfo, err error) error {
|
|
err := filepath.Walk(folder, func(path string, info os.FileInfo, err error) error {
|
|
- if !info.IsDir() {
|
|
|
|
- wg.Add(1)
|
|
|
|
- go outputHash(path)
|
|
|
|
|
|
+ count++
|
|
|
|
+ if (count % 100) == 0 {
|
|
|
|
+ fmt.Print(".")
|
|
|
|
+ }
|
|
|
|
+ if (count % 10000) == 0 {
|
|
|
|
+ fmt.Println()
|
|
|
|
+ }
|
|
|
|
+ filename := info.Name()
|
|
|
|
+ if filename[0:1] != "." {
|
|
|
|
+ if info.IsDir() {
|
|
|
|
+ fmt.Println(path)
|
|
|
|
+ }
|
|
|
|
+ if !info.IsDir() {
|
|
|
|
+ wg.Add(1)
|
|
|
|
+ go outputHash(path)
|
|
|
|
+ }
|
|
}
|
|
}
|
|
return nil
|
|
return nil
|
|
})
|
|
})
|
|
@@ -111,22 +136,29 @@ func processFolder(folder string) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-func saveHashfile(hashFile Fdhashes) {
|
|
|
|
|
|
+func saveHashfile(hashFile Fdhashes, dir string) {
|
|
b, err := json.Marshal(hashFile)
|
|
b, err := json.Marshal(hashFile)
|
|
if err != nil {
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
fmt.Println(err)
|
|
return
|
|
return
|
|
}
|
|
}
|
|
- err = ioutil.WriteFile(hashFile.Path+".fdhashes3", b, 0644)
|
|
|
|
|
|
+ err = ioutil.WriteFile(dir+".fdhashes3", b, 0644)
|
|
if err != nil {
|
|
if err != nil {
|
|
panic(err)
|
|
panic(err)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
func loadHashfile(filename string) Fdhashes {
|
|
func loadHashfile(filename string) Fdhashes {
|
|
- file, err := ioutil.ReadFile(filename)
|
|
|
|
- if err != nil {
|
|
|
|
- panic(err)
|
|
|
|
|
|
+ data := Fdhashes{Hashes: make(map[string]string)}
|
|
|
|
+ if !rewrite {
|
|
|
|
+ file, err := ioutil.ReadFile(filename)
|
|
|
|
+ if err != nil {
|
|
|
|
+ panic(err)
|
|
|
|
+ }
|
|
|
|
+ err = json.Unmarshal([]byte(file), &data)
|
|
|
|
+ if err != nil {
|
|
|
|
+ panic(err)
|
|
|
|
+ }
|
|
}
|
|
}
|
|
data := Fdhashes{}
|
|
data := Fdhashes{}
|
|
err = json.Unmarshal([]byte(file), &data)
|
|
err = json.Unmarshal([]byte(file), &data)
|