|
@@ -22,6 +22,7 @@ type Fdhashes struct {
|
|
Path string
|
|
Path string
|
|
Hashes map[string]string
|
|
Hashes map[string]string
|
|
Times map[string]time.Time
|
|
Times map[string]time.Time
|
|
|
|
+ Dirty bool
|
|
}
|
|
}
|
|
|
|
|
|
var hashes map[string]Fdhashes
|
|
var hashes map[string]Fdhashes
|
|
@@ -59,6 +60,7 @@ func main() {
|
|
|
|
|
|
fmt.Println("waiting")
|
|
fmt.Println("waiting")
|
|
wg.Wait()
|
|
wg.Wait()
|
|
|
|
+ saveAllHashFiles()
|
|
log.Println("done")
|
|
log.Println("done")
|
|
}
|
|
}
|
|
|
|
|
|
@@ -93,12 +95,11 @@ 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), Times: make(map[string]time.Time)}
|
|
|
|
|
|
+ hashFile = Fdhashes{Path: dir, Hashes: make(map[string]string), Times: make(map[string]time.Time), Dirty: true}
|
|
} else {
|
|
} else {
|
|
hashFile = loadHashfile(dir + ".fdhashes3")
|
|
hashFile = loadHashfile(dir + ".fdhashes3")
|
|
}
|
|
}
|
|
hashes[dir] = hashFile
|
|
hashes[dir] = hashFile
|
|
- saveHashfile(hashFile)
|
|
|
|
}
|
|
}
|
|
lock1.RLock()
|
|
lock1.RLock()
|
|
_, ok = hashFile.Hashes[fileName]
|
|
_, ok = hashFile.Hashes[fileName]
|
|
@@ -120,11 +121,12 @@ func outputHash(fileStr string) {
|
|
lock1.Lock()
|
|
lock1.Lock()
|
|
hashFile.Hashes[fileName] = hash
|
|
hashFile.Hashes[fileName] = hash
|
|
lock1.Unlock()
|
|
lock1.Unlock()
|
|
|
|
+
|
|
lock2.Lock()
|
|
lock2.Lock()
|
|
hashFile.Times[fileName] = time
|
|
hashFile.Times[fileName] = time
|
|
lock2.Unlock()
|
|
lock2.Unlock()
|
|
|
|
+ saveHashfile(&hashFile)
|
|
hashes[dir] = hashFile
|
|
hashes[dir] = hashFile
|
|
- saveHashfile(hashFile)
|
|
|
|
mu.Unlock()
|
|
mu.Unlock()
|
|
log.Printf("file \"%s\" has hash \"%s\"\n", fileStr, hash)
|
|
log.Printf("file \"%s\" has hash \"%s\"\n", fileStr, hash)
|
|
}
|
|
}
|
|
@@ -153,9 +155,10 @@ func processFolder(folder string) {
|
|
addWork++
|
|
addWork++
|
|
wg.Add(1)
|
|
wg.Add(1)
|
|
go outputHash(path)
|
|
go outputHash(path)
|
|
- if addWork > 100 {
|
|
|
|
|
|
+ if addWork > 1000 {
|
|
fmt.Println("x")
|
|
fmt.Println("x")
|
|
wg.Wait()
|
|
wg.Wait()
|
|
|
|
+ saveAllHashFiles()
|
|
addWork = 0
|
|
addWork = 0
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -167,21 +170,39 @@ func processFolder(folder string) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-func saveHashfile(hashFile Fdhashes) {
|
|
|
|
- b, err := json.Marshal(hashFile)
|
|
|
|
- if err != nil {
|
|
|
|
- fmt.Println(err)
|
|
|
|
- return
|
|
|
|
|
|
+func saveHashfile(hashFile *Fdhashes) {
|
|
|
|
+ hashFile.Dirty = true
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func saveAllHashFiles() {
|
|
|
|
+ hashList := make([]Fdhashes, 0)
|
|
|
|
+
|
|
|
|
+ for _, hashFile := range hashes {
|
|
|
|
+ if hashFile.Dirty {
|
|
|
|
+ hashFile.Dirty = false
|
|
|
|
+ b, err := json.Marshal(hashFile)
|
|
|
|
+ if err != nil {
|
|
|
|
+ fmt.Println(err)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ err = ioutil.WriteFile(hashFile.Path+".fdhashes3", b, 0644)
|
|
|
|
+ if err != nil {
|
|
|
|
+ panic(err)
|
|
|
|
+ }
|
|
|
|
+ hashList = append(hashList, hashFile)
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- err = ioutil.WriteFile(hashFile.Path+".fdhashes3", b, 0644)
|
|
|
|
- if err != nil {
|
|
|
|
- panic(err)
|
|
|
|
|
|
+
|
|
|
|
+ hashes = make(map[string]Fdhashes)
|
|
|
|
+ for _, hashFile := range hashList {
|
|
|
|
+ hashes[hashFile.Path] = hashFile
|
|
}
|
|
}
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
func loadHashfile(fileStr string) Fdhashes {
|
|
func loadHashfile(fileStr string) Fdhashes {
|
|
dir, _ := filepath.Split(fileStr)
|
|
dir, _ := filepath.Split(fileStr)
|
|
- data := Fdhashes{Path: dir, Hashes: make(map[string]string), Times: make(map[string]time.Time)}
|
|
|
|
|
|
+ data := Fdhashes{Path: dir, Hashes: make(map[string]string), Times: make(map[string]time.Time), Dirty: false}
|
|
if !rewrite {
|
|
if !rewrite {
|
|
file, err := ioutil.ReadFile(fileStr)
|
|
file, err := ioutil.ReadFile(fileStr)
|
|
if err != nil {
|
|
if err != nil {
|
|
@@ -192,8 +213,9 @@ func loadHashfile(fileStr string) Fdhashes {
|
|
log.Printf("can't read file %s", fileStr)
|
|
log.Printf("can't read file %s", fileStr)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- if data.Path == "" {
|
|
|
|
|
|
+ if data.Path != dir {
|
|
data.Path = dir
|
|
data.Path = dir
|
|
|
|
+ data.Dirty = true
|
|
}
|
|
}
|
|
return data
|
|
return data
|
|
}
|
|
}
|