|
@@ -35,6 +35,9 @@ var logger = clog.New()
|
|
|
func PrintUsage() {
|
|
|
println(`Usage:
|
|
|
sync <frompath> <topath> [<copytopath> ...]
|
|
|
+<frompath> 源文件路径
|
|
|
+<topath> 目标文件路径,增量同步
|
|
|
+<copytopath> 副本文件路径,<topath>增量同步
|
|
|
`)
|
|
|
}
|
|
|
|
|
@@ -136,8 +139,9 @@ func sync_once(frompath, topath string, copytopath ...string) (err error) {
|
|
|
if tofi != nil && fromfi.Size() == tofi.Size() && fromfi.ModTime() == tofi.ModTime() {
|
|
|
return true
|
|
|
}
|
|
|
- fmt.Print(fromfile, " ==> ", tofile)
|
|
|
- frombs, e := ReadFile(fromfile)
|
|
|
+ progressinfo := fmt.Sprint(fromfile, " ==> ", tofile)
|
|
|
+ fmt.Print(progressinfo)
|
|
|
+ frombs, e := ReadFile(fromfile, progressinfo)
|
|
|
if e != nil {
|
|
|
err = fmt.Errorf("from file %v", e)
|
|
|
return false
|
|
@@ -162,12 +166,11 @@ func sync_once(frompath, topath string, copytopath ...string) (err error) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func ReadFile(name string) (data []byte, err error) {
|
|
|
- fmt.Print(" -.--%")
|
|
|
+func ReadFile(name string, progressinfo string) (data []byte, err error) {
|
|
|
defer fmt.Println()
|
|
|
data = make([]byte, 0, 512)
|
|
|
for {
|
|
|
- data, err = ReadFileContinue(name, data)
|
|
|
+ data, err = ReadFileContinue(name, progressinfo, data)
|
|
|
if err == io.EOF {
|
|
|
err = nil
|
|
|
return
|
|
@@ -175,7 +178,7 @@ func ReadFile(name string) (data []byte, err error) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func ReadFileContinue(name string, data []byte) ([]byte, error) {
|
|
|
+func ReadFileContinue(name string, progressinfo string, data []byte) ([]byte, error) {
|
|
|
f, err := os.Open(name)
|
|
|
if err != nil {
|
|
|
return data, err
|
|
@@ -204,17 +207,22 @@ func ReadFileContinue(name string, data []byte) ([]byte, error) {
|
|
|
}
|
|
|
|
|
|
statuschan := make(chan int64, 100)
|
|
|
+ done := make(chan struct{}, 1)
|
|
|
go func() {
|
|
|
+ rateinfo := ""
|
|
|
for range statuschan {
|
|
|
- s := fmt.Sprintf("%.2f%%", 100*float64(offset)/float64(filesize))
|
|
|
- bs := strings.Repeat("\b", len(s))
|
|
|
- fmt.Printf("%s%s", bs, s)
|
|
|
+ // bs := strings.Repeat("\b", len(progressinfo+rateinfo))
|
|
|
+ rateinfo := fmt.Sprintf(" %.2f%% ", 100*float64(offset)/float64(filesize))
|
|
|
+ // fmt.Printf("\r%s%s", bs, progressinfo+rateinfo)
|
|
|
+ fmt.Printf("\r%s", progressinfo+rateinfo)
|
|
|
}
|
|
|
if offset >= filesize {
|
|
|
- s := fmt.Sprintf("%.2f%%", 100.)
|
|
|
- bs := strings.Repeat("\b", len(s))
|
|
|
- fmt.Printf("%s%s", bs, s)
|
|
|
+ // bs := strings.Repeat("\b", len(progressinfo+rateinfo))
|
|
|
+ rateinfo = fmt.Sprintf(" %.2f%% ", 100.)
|
|
|
+ // fmt.Printf("\r%s%s", bs, progressinfo+rateinfo)
|
|
|
+ fmt.Printf("\r%s", progressinfo+rateinfo)
|
|
|
}
|
|
|
+ done <- struct{}{}
|
|
|
}()
|
|
|
chunk := int64(1024 * 256)
|
|
|
t := time.Now()
|
|
@@ -228,6 +236,7 @@ func ReadFileContinue(name string, data []byte) ([]byte, error) {
|
|
|
statuschan <- offset
|
|
|
if err != nil {
|
|
|
close(statuschan)
|
|
|
+ <-done
|
|
|
return data[:offset], err
|
|
|
}
|
|
|
if offset >= int64(cap(data)) {
|